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