Javascript Function.prototype.bind的实现

Javascript Function.prototype.bind的实现,javascript,node.js,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 () {

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)));
    }

};

有什么明显的错误或遗漏吗?

由于bind并不总是跨浏览器的,所以它有一个polyfill,在这个问题中也提到了:

实现(来自John Resig的书)与您的(几乎)相同,因此不应该有任何错误

编辑


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

由于绑定并不总是跨浏览器,因此它有一个多边形填充,并且在这个问题中也提到了它:

实现(来自John Resig的书)与您的(几乎)相同,因此不应该有任何错误

编辑


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

您已经了解了主要思想,但是如果您仔细观察,有一些地方不太正确:

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

1:这在ES6之前无法可靠区分。为了学究式,只有在原始函数也是可构造的情况下,绑定函数才应该是可构造的。
2:这仅在ES6时才变得相关。

3:这只能通过ES6之前的某种
eval
magic来实现。

你已经掌握了主要思想,但是如果你仔细观察,有一些观点就不那么正确了:

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

1:这在ES6之前无法可靠区分。为了学究式,只有在原始函数也是可构造的情况下,绑定函数才应该是可构造的。
2:这仅在ES6时才变得相关。

3:这只能通过ES6之前的某种
eval
magic来实现。

仅仅因为John Resig编写了函数并不能使其正确:-)仅仅因为John Resig编写了函数并不能使其正确:-)
/*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*/       };