有没有理由不能“NOT”定义Function.prototype.bind的第一个参数,并让它保留被调用的上下文。
我有一个用例,其中非常有用,但它似乎传递null或undefined,因为第一个参数将输出函数绑定到Window。
另一种说法,这意味着当前的本机绑定实现似乎不允许您绑定函数的上下文,只将参数前缀绑定到绑定函数。
前:
var a = function() {
this.foo = function() { console.log(this) };
this.foo = this.foo.bind(undefined,1);
};
var b = new a();
b.foo(); // Logs Window instead of the instance b;
这是在Google Chrome版本27.0.1453.116 m
中测试的答案 0 :(得分:2)
您需要创建自己的活页夹功能才能执行此操作。拥有.bind()
的主要原因是处理非词法定义的this
。因此,如果不设置this
,他们就无法使用它。
以下是您可以使用的简单示例:
Function.prototype.argBind = function() {
var fn = this;
var args = Array.prototype.slice.call(arguments);
return function() {
return fn.apply(this, args.concat(Array.prototype.slice.call(arguments)));
};
};
这非常简单,并不处理作为构造函数调用的函数,但如果需要,可以添加该支持。
除非将.bind()
或null
作为第一个参数传递,否则您还可以将其增强为与原始undefined
相似。
Function.prototype.argBind = function(thisArg) {
// If `null` or `undefined` are passed as the first argument, use `.bind()`
if (thisArg != null) {
return this.bind.apply(this, arguments);
}
var fn = this;
var args = Array.prototype.slice.call(arguments);
return function() {
return fn.apply(this, args.concat(Array.prototype.slice.call(arguments)));
};
};