模拟实现call, apply和bind函数

2020-05-03  本文已影响0人  风雅欢乐

可以从以下几点来考虑如何实现

模拟实现call

Function.prototype.myCall = function (context, ...args) {
    const context = context || window;
    
    // 给context添加一个属性, 指向该函数
    context.fn = this;
    const result = context.fn(...args);

    // 执行完毕, 删除添加的函数
    delete context.fn;
    return result;
}

模拟实现apply

Function.prototype.myApply = function(context, argsArray) {
    const context = context || window;

    context.fn = this;
    let result;
    if (argsArray) {
        result = context.fn(...argsArray);
    } else {
        result = context.fn();
    }

    delete context.fn;
    return result;
}

模拟实现bind函数

Function.prototype.myBind = function (context, ...args) {
    if (typeof this!== 'function') {
        throw new TypeError('myBind can only be called by a function');
    }

    const that = this;

    return function (...argsInner) {
        return that.apply(context, args.concat(argsInner));
    }
}
上一篇 下一篇

猜你喜欢

热点阅读