call
語法:
fun.call(thisArg,arg1,arg2,...)
,調用一個函數, 其具有一個指定的this值和分別地提供的參數(參數的列表)。
apply
語法:
func.apply(thisArg,[argsArray])
,調用一個函數,以及作爲一個數組(或類似數組對象)提供的參數。
Function.call
按套路實現
call
核心:
-
將函數設爲對象的屬性
-
執行&刪除這個函數
-
指定
this
到函數並傳入給定參數執行函數 -
如果不傳入參數,默認指向爲 window
爲啥說是套路實現呢?因爲真實面試中,面試官很喜歡讓你逐步地往深考慮,這時候你可以反套路他,先寫個簡單版的:
var foo = {
value: 1,
bar: function() {
console.log(this.value)
}
}
foo.bar()
// 1
當面試官有進一步的發問,或者此時你可以假裝思考一下。然後寫出以下版本:
Function.prototype.call2 =
function (content = window) {
content.fn = this;
let args = [...arguments].slice(1);
let result = content.fn(...args);
delete content.fn;
return result;
}
var foo = { value: 1 }
function bar (name, age) {
console.log(name)
console.log(age)
console.log(this.value);
}
bar.call2(foo, 'black', '18')
// black 18 1
Function.apply
的模擬實現
apply()
的實現和 call()
類似,只是參數形式不同。直接貼代碼吧:
Function.prototype.apply2 = function (context = window) {
context.fn = this
let result;
// 判斷是否有第二個參數
if (arguments[1]) {
result = context.fn(...arguments[1])
} else {
result = context.fn()
}
delete context.fn()
return result
}