apply的模擬實現

咱們知道call和apply方法的做用基本同樣,主要的區別在於第二個參數的傳遞,call直接傳遞參數便可,apply的須要傳遞一個參數列表。
所以call和apply的實現原理基本相同,能夠參考https://segmentfault.com/a/11...
這樣咱們就直接上最終版的實現代碼,以下segmentfault

Function.prototype.apply2 = function (context, arr) {
    context = context || window
    var args = []
    //遍歷參數列表中的數據而後添加到args數組中
    for (var i = 0; i < arr.length; i++) {
        args.push('arr[' + i + ']')
    }
    // 在obj對象中添加fn屬性,而且fn的值爲函數bar
    context.fn = this
    // 執行fn方法,並返回值
    const result = eval('context.fn(' + args + ')')
    // 執行fn方法結束後,刪除添加到obj中的fn方法
    delete context.fn
    return result
}
var obj = {
    value: 1
}
function bar(name, age) {
    console.log(name, age)
    return {
      value: this.value,
      name,
      age
    }
}
console.log(bar.apply2(obj, ['張三', 18]))

使用ES6方法實現以下數組

Function.prototype.apply2 = function (context, arr) {
    context = context || window
    let fn = Symbol()
    context.fn = this
    const result = context.fn(...arr)
    delete context.fn
    return result
}
var obj = {
    value: 1
}
function bar(name, age) {
    console.log(name, age)
    return {
      value: this.value,
      name,
      age
    }
}
console.log(bar.apply2(obj, ['張三', 18]))
相關文章
相關標籤/搜索