如何在回调中访问正确的`this`?

我有一个构造函数,它注册一个事件处理程序:


function MyConstructor(data, transport) {

    this.data = data;

    transport.on('data', function () {

        alert(this.data);

    });

}


// Mock transport object

var transport = {

    on: function(event, callback) {

        setTimeout(callback, 1000);

    }

};


// called as

var obj = new MyConstructor('foo', transport);

但是,我无法data在回调中访问已创建对象的属性。它看起来this并不是指创建的对象,而是指另一个对象。


我还尝试使用对象方法而不是匿名函数:


function MyConstructor(data, transport) {

    this.data = data;

    transport.on('data', this.alert);

}


MyConstructor.prototype.alert = function() {

    alert(this.name);

};

但它表现出同样的问题。


如何访问正确的对象?


杨魅力
浏览 930回答 6
6回答

人到中年有点甜

我们不能将setTimeout()它绑定到,因为它总是用全局对象(Window)执行,如果你想this在回调函数中访问上下文,那么通过使用bind()我们可以实现的回调函数:setTimeout(function(){     this.methodName();}.bind(this), 2000);
打开App,查看更多内容
随时随地看视频慕课网APP