call apply及bind的實現原理

2021-09-24 19:22:21 字數 1209 閱讀 2391

2. call的實現原理

我們知道,函式都可以呼叫call,說明call是函式原型上的方法,所有的例項都可以呼叫。即:function.prototype.call

其次,如果第乙個引數沒有傳入,在全域性環境下,那麼預設this指向window(瀏覽器) / global(node)(非嚴格模式);

傳入call的第乙個引數是this指向的物件,根據隱式繫結的規則,我們知道obj.foo()foo()中的this指向obj,因此我們可以這樣呼叫函式thisargs.func(...args),所以相應的func中的this就指向了thisargs,然後返回執行結果。

function.prototype.ca_ll = function() 

thisargs.func = this;

let result = thisargs.func(...args);

delete thisargs.func; // thisargs上並沒有func屬性,所以執行結果之後需要移除

return result;

}// 測試用例

var foo =

function func(job, age)

func.ca_ll(foo, 'coder', 45); //zl coder 45

let [thisargs, args] = arguments;

let result; // 函式返回結果

if(!thisargs)

thisargs.func = this;

if(!args) else

delete thisargs.func;

return result;

}// 測試用例

let foo =

function func(job, age)

4. bind的實現原理

bind的實現見柯里化一篇

手寫 call apply 及 bind 函式

function.prototype.mycall function context context context window context.fn this 建立fn屬性,並將值設定為需要呼叫的函式 const args arguments slice 1 因為call可以傳入多個引數作為呼叫...

call,apply和bind的用法及區別

callfunction fn x,y console.log x y 11 var obj 語法 fn.call obj,2,9 應用 var obj array.prototype.push.call obj,30 console.log obj call obj,0,2 console.log...

對call apply和bind的理解及他們的區別

console.log function.prototype.hasownproperty call console.log function.prototype.hasownproperty console.log function.prototype.hasownproperty bind 上面...