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)));
}
};
任何明显错误或遗失的东西?
答案 0 :(得分:3)
您已经掌握了主要想法,但如果您仔细观察(the spec),则有些观点不太正确:
bind
应该在未调用函数时立即抛出TypeError
bind.length
应为1
.apply
方法.prototype
属性new
1 .length
等于原始的arity减去绑定参数的数量 3 .name
,其中包含原始 3 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
。