3

考虑以下代码

Class.prototype.init = function() {
    var self = this;
    var onComplete = function() {
        self.a.doSomethingElse(self._go);
    };

    console.log(this); //prints Object {...}
    this.a.doSomething(onComplete); //onComplete is called inside a
};

Controller.prototype._go = function(map) {
    console.log(this); //prints 'Window'
};

问题是为什么this等于window内部_go函数?

4

1 回答 1

4

通过调用属性来绑定对象只适用于直接调用它。当只是访问该属性并稍后调用它(例如通过将其传递给回调)时,不会保留对象绑定。

行为归结为以下几点:

var a = {
  b: function() {
    console.log(this);
  }
};

a.b(); // logs a, because called directly

var func = a.b;
func(); // logs window, because not called directly

在您的情况下,您也可以通过Controller.prototype._go,因为它指的是相同的功能。解决方法是使用self._go.bind(self)保持绑定。

于 2012-12-06T11:56:51.937 回答