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 上面...