美文网首页
模拟实现call, apply和bind函数

模拟实现call, apply和bind函数

作者: 风雅欢乐 | 来源:发表于2020-05-03 17:33 被阅读0次

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

  • 第一个参数context如果没有传递, 默认为window
  • 改变this指向, 让context可以执行该函数, 那么可以给context添加一个函数, 执行完成后删除

模拟实现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));
    }
}

相关文章

网友评论

      本文标题:模拟实现call, apply和bind函数

      本文链接:https://www.haomeiwen.com/subject/qyxjghtx.html