三者都是用於改變函式體內this的指向,但是bind
var obj ={};function
test()
test();
//false
var testobj =test.bind(obj);
testobj();
//true
以下是mdn文件:
bind語法:
call語法:
語法:thisarg:
在 fun 函式執行時指定的 this 值。需要注意的是,指定的 this 值並不一定是該函式執行時真正的 this 值,如果這個函式處於非嚴格模式下,則指定為 null 或 undefined 時會自動指向全域性物件(瀏覽器中就是window物件),同時值為原始值(數字,字串,布林值)的 this 會指向該原始值的自動包裝物件。
argsarray
乙個陣列或者類陣列物件,其中的陣列元素將作為單獨的引數傳給 fun 函式。如果該引數的值為null 或 undefined,則表示不需要傳入任何引數。從ecmascript 5 開始可以使用類陣列物件。
區別總結:
如果你要傳遞的引數不多,則可以使用fn.call(thisobj, arg1, arg2 ...)
如果你想生成乙個新的函式長期繫結某個函式給某個物件使用,則可以使用const newfn = fn.bind(thisobj); newfn(arg1, arg2...)
function.prototype.mybind = function() };
/** * 每個函式都可以呼叫call方法,來改變當前這個函式執行的this關鍵字,並且支援傳入引數 */
function.prototype.mycall = function
(context)
//執行這個函式,並返回結果
var result = eval("context.fn(" + arr.tostring() + ")");
//將this指向銷毀
delete
context.fn;
return
result;
}
/***/(context, arr) else
result = eval("context.fn([" + args.tostring() + "])");
}//將this指向銷毀
delete
context.fn;
return
result;
}
var obj ={};function
test()
var testobj =test.bind(obj);
testobj();
//true
var objtest =;/**
* 預期返回false, 但是testobj是個繫結函式,所以不能改變其this指向 */
//true
testobj.call(objtest); //
true
bind,call,apply方法的實現
1.call 方法 第乙個引數為 this 指向,第二個引數及以後 為傳入執行函式的引數。function mycall context function context const target this context context object context window 當傳入的為 un...
js中bind call apply的方法使用
在js中,這三者都是用來改變函式的this物件的指向的,他們有什麼樣的區別呢。在說區別之前還是先總結一下三者的相似之處 1 都是用來改變函式的this物件的指向的。2 第乙個引數都是this要指向的物件。3 都可以利用後續引數傳參。那麼他們的區別在 的,先看乙個例子。var xw var xh xw...
原生js實現bind call apply 二
this name 81 var obj var res obj.getname res 輸出 81 array 0 輸出array 0 是因為我沒有傳遞引數,所以params的長度為0這樣的呼叫方法,會因為 this 指向的問題得不到正確的值syw,所以要在呼叫時改變 this 指向,即可輸出正確...