如何實現一個call或 apply方法,手寫一個call或apply

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
}

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章