Javascript Function.prototype.bind的实现
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 () {
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
- 当使用
1调用时,绑定函数应构造与原始函数相同类型的实例new
- 绑定函数应具有与原始函数相同的原型2
- 绑定函数的
应等于原始参数的算术数减去绑定参数的数量3.length
- 绑定函数应该有一个
,其中包含原始3的名称.name
2:这仅在ES6时才变得相关。
3:这只能通过ES6之前的某种
eval
magic来实现。你已经掌握了主要思想,但是如果你仔细观察,有一些观点就不那么正确了:
在未调用函数时应立即抛出bind
TypeError
应为bind.length
1
- 绑定函数不应依赖原始函数来使用
方法.apply
- 绑定函数不应具有
属性.prototype
- 当使用
1调用时,绑定函数应构造与原始函数相同类型的实例new
- 绑定函数应具有与原始函数相同的原型2
- 绑定函数的
应等于原始参数的算术数减去绑定参数的数量3.length
- 绑定函数应该有一个
,其中包含原始3的名称.name
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*/ };