javascript bind関数
3042 ワード
bind関数は、名前の通り、関数を呼び出して一つの作用領域を結びつけるために使用されます.thisは元の役割領域をなくしやすく、直接トップのwindowオブジェクトを指します.具体的な結論は私のもう一つのブログ「javascriptのダイナミックthisとダイナミックバインディング」を参照してください.本論文は侵入しないバインディング関数の設計に焦点を当てている.
function scopeTest(){
alert(this.name)
)
//ling the function in global scope:
scopeTest()
//->「the window object」
var foo={
name:「the foo object!」
otherseScope Test:function(){alert(this.name)}
)
foo.other ScropeTest()
//->「the foo object!」
実行コード
原生オブジェクトを拡張しない原則に基づいて、このbind関数(domを作用領域とします)をいじりました.使い方はProttypeフレームのbindと同じです.
dom={}
dom.bind=function(fn,context){
if(argments.length<2&context==undefined)return fn;
var method=fn、
slice=Aray.prototype.slice、
args=slice.cal(argments,2)
return function(){/ここから元fnに入るパラメータ
var array=slice.cal(argments,0);
method.aply(context,args.co ncat)
)
)
window.name='This window'
var jj={
name:'これはjjです
alertName:function(){/バインディングが無効になります.
alert(this.name)
)
}
var kk={
name:「kkです」
)
function run(f){
f()
)
ルン(jj.alertName)
var fx 2=dom.bind(jj.alertName,jj)
run(fx 2)
var fx 3=dom.bind(jj.alertName,window)
run(fx 3)
var fx 4=dom.bind(jj.alertName,kk)
run(fx 4)
実行コード
別の例:
dom={}
dom.bind=function(fn,context){
if(argments.length<2&context==undefined)return fn;
var method=fn、
slice=Aray.prototype.slice、
args=slice.cal(argments,2)
return function(){/ここから元fnに入るパラメータ
var array=slice.cal(argments,0);
method.aply(context,args.co ncat)
)
)
var obj={
name:'A nice demo'は、
fx:function(){
alert(this.name+'
+Aray.prototype.slite.call(argments,0).jun(',')
)
}
var fx 2=dom.bind(obj.fx,obj,1,2,3)
fx 2(4,5)//Alerts the proper name,then「1,2,3,4,5」
実行コード
window.name = "the window object"
function scopeTest() {
return this.name
}
// calling the function in global scope:
scopeTest()
// -> "the window object"
var foo = {
name: "the foo object!",
otherScopeTest: function() { return this.name }
}
foo.otherScopeTest()
// -> "the foo object!"
window.name=「the window object」function scopeTest(){
alert(this.name)
)
//ling the function in global scope:
scopeTest()
//->「the window object」
var foo={
name:「the foo object!」
otherseScope Test:function(){alert(this.name)}
)
foo.other ScropeTest()
//->「the foo object!」
実行コード
原生オブジェクトを拡張しない原則に基づいて、このbind関数(domを作用領域とします)をいじりました.使い方はProttypeフレームのbindと同じです.
dom.bind = function(fn,context){
// , thisObject,scope,
// ,
if (arguments.length < 2 && context===undefined) return fn;
var method = fn,
slice = Array.prototype.slice,
args = slice.call(arguments, 2) ;
return function(){// fn
var array = slice.call(arguments, 0);
method.apply(context,args.concat(array))
}
使用法:最初のパラメータは作用領域の関数を結びつける必要があり、二つ目はwindowまたは各種オブジェクトで、他のパラメータは任意です.dom={}
dom.bind=function(fn,context){
if(argments.length<2&context==undefined)return fn;
var method=fn、
slice=Aray.prototype.slice、
args=slice.cal(argments,2)
return function(){/ここから元fnに入るパラメータ
var array=slice.cal(argments,0);
method.aply(context,args.co ncat)
)
)
window.name='This window'
var jj={
name:'これはjjです
alertName:function(){/バインディングが無効になります.
alert(this.name)
)
}
var kk={
name:「kkです」
)
function run(f){
f()
)
ルン(jj.alertName)
var fx 2=dom.bind(jj.alertName,jj)
run(fx 2)
var fx 3=dom.bind(jj.alertName,window)
run(fx 3)
var fx 4=dom.bind(jj.alertName,kk)
run(fx 4)
実行コード
別の例:
dom={}
dom.bind=function(fn,context){
if(argments.length<2&context==undefined)return fn;
var method=fn、
slice=Aray.prototype.slice、
args=slice.cal(argments,2)
return function(){/ここから元fnに入るパラメータ
var array=slice.cal(argments,0);
method.aply(context,args.co ncat)
)
)
var obj={
name:'A nice demo'は、
fx:function(){
alert(this.name+'
+Aray.prototype.slite.call(argments,0).jun(',')
)
}
var fx 2=dom.bind(obj.fx,obj,1,2,3)
fx 2(4,5)//Alerts the proper name,then「1,2,3,4,5」
実行コード