4

是否有理由不能“不”定义 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 中测试的

4

1 回答 1

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(),除非nullundefined作为第一个参数传递。

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)));
    };
};
于 2013-06-27T23:20:19.217 回答