Function.prototype.bind的实现

时间:2016-06-02 23:16:12

标签: javascript node.js

JavaScript的Function.prototype.bind的实现是或多或少正确吗?

Function.prototype.bindTemp = function () {

    const fn = this;
    var args = Array.prototype.slice.apply(arguments);
    const ctx = args[0];
    args = args.slice(1);

    return function () {
        return fn.apply(ctx, args.concat(Array.prototype.slice.apply(arguments)));
    }

};

任何明显错误或遗失的东西?

2 个答案:

答案 0 :(得分:3)

您已经掌握了主要想法,但如果您仔细观察(the spec),则有些观点不太正确:

  • bind应该在未调用函数时立即抛出TypeError
  • bind.length应为1
  • 绑定函数不应该依赖原始函数来使用.apply方法
  • 绑定函数不应具有.prototype属性
  • 当使用new 1
  • 调用时,绑定函数应构造与原始函数相同类型的实例
  • 绑定函数应与原始 2
  • 具有相同的原型
  • 绑定函数应该有.length等于原始的arity减去绑定参数的数量 3
  • 绑定函数应该包含.name,其中包含原始 3
  • 的名称

您会找到better polyfill at MDN

1:在ES6之前无法可靠地区分。如果原作也是如此,那么约束函数应该只是可构造的 2:这仅与ES6相关 3:这只能在ES6之前使用某种eval魔法来实现。

答案 1 :(得分:1)

由于bind并不总是跨浏览器,因此有一个polyfill,并且在这个问题中也提到了它:Javascript's Bind implementation?

/*1*/       Function.prototype.bind = function ()
/*2*/       {
/*3*/           var fn = this,
/*4*/               args = Array.prototype.slice.call(arguments),
/*5*/               object = args.shift();
/*6*/           return function ()
/*7*/           {
/*8*/               return fn.apply(object,
/*9*/                   args.concat(Array.prototype.slice.call(arguments)));
/*10*/           };
/*11*/       };

实施(来自John Resig的书)和你的(差不多)相同,所以不应该有任何错误。

修改

返回使用() =>而非function()创建的函数可避免将this变量存储到fn,因为箭头函数会绑定上面的this