JavaScript: this变量和回调函数

4
请看以下代码:
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'
};

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

1个回答

5
调用属性时,对象的绑定仅适用于直接调用。如果只是访问该属性并稍后调用它(例如将其传递给回调函数),则不会保留对象绑定。
该行为可以归结为以下内容:
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)来保持绑定。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接