Function.prototype.bind的实现

JavaScript的Function.prototype.bind的这个实现或多或less是正确的?

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应立即抛出一个TypeError
  • bind.length应该是1
  • 绑定函数不应该依赖原来的.apply方法
  • 绑定函数不应该有.prototype属性
  • 绑定的函数应该用new 1调用时构造一个与原始types相同的实例
  • 绑定的函数应该和原来的2有相同的原型
  • 绑定函数的.length应该等于原始数据的长度减去绑定参数的数量3
  • 绑定的函数应该有一个包含原始名称3.name

你会发现在MDN更好的polyfill 。

1:这在ES6之前不能可靠地区分。 如果原文如此,那么这种约束function也应该是可以构build的。
2:这只和ES6有关。
3:这只能用ES6之前的某种eval魔术来实现。

由于绑定并不总是通过浏览器,它有一个polyfill,它也在这个问题中提到: Javascript的绑定实现?

 /*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()创build的function()会避免你将thisvariables存储到fn ,因为箭头函数绑定了上面的this