天天看點

手寫系列 # 4:實作 apply 方法

實作

apply 文法:

  • fun.apply(context, [argsArr])
  • context:在fun 函數運作時指定的this值
  • argsArr:一個數組或者是類數組對象,其中數組中元素會作為單獨參數傳給fun。當參數值為null 或者undefined時,表示不需要傳入任何參數。
Function.prototype.kaimoApply = function (context) {
  context = context || window;
  // 保留 this 
  const symbolFn = Symbol();
  context[symbolFn] = this;
  // 執行函數:處理參數上和 call 有差別
  console.log(arguments, arguments[1]);
  const result = arguments[1] ? context[symbolFn](...arguments[1]) : context[symbolFn]();
  // 删除上下文對象的屬性
  delete context[symbolFn];
  // 傳回執行結果
  return result;
}
const kaimoObj = {
  name: 'kaimo'
};
function kaimoTest() {
  console.log(this.name);
}
kaimoTest.kaimoApply(kaimoObj, [1, 2, 3]);