EventEmitter - 添加侦听器时,为什么范围会有所不同?

时间:2013-12-02 19:23:56

标签: node.js eventemitter

我有一个自定义的EventEmitter对象,它在收到消息时发出。在收到消息后,我将它发布到来自对象的消息交换,该对象将使用从同一对象定义的回调。以下交换功能的示例:

function Exchange() {
    this.events = {
        published: function (data) {
            console.log(data);
        }
    };
}

Exchange.prototype.publish = function (data) {
    this.events.published(data);
};

在我的接收方,我有自定义的EventEmitter,它会发出数据:

server.on('data', function (data) {
    exchange.publish(data);
});

这样可行,但由于exchange.publish和侦听器使用相同的参数,我想使用:

server.on('data', exchange.publish);

这不起作用,因为this方法内的publish范围发生了变化,导致this.events未定义。为什么会这样?

1 个答案:

答案 0 :(得分:1)

您将函数本身作为回调传递,因此不会将其作为对象的方法调用,而this将不会引用该对象。有关this

的详细信息,请参阅MDN documentation

您可以使用.bind将函数显式绑定到某个对象:

server.on('data', exchange.publish.bind(exchange));