bind call apply的區別與實現

2022-08-26 09:54:06 字數 1751 閱讀 2109

三者都是用於改變函式體內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 指向,即可輸出正確...