0

目前我有一个具有以下形式的 Node.js 模块:

var events = require('events');
var emitter = new events.EventEmitter();

function emitSomething() {
    emitter.emit("event");
}
exports.emitSomething = emitSomething;
exports.on = emitter.on;

但是,通过注册的任何回调on在我调用时都不会被调用emitSomething

我可以通过将最后一行更改为

exports.on = function(event, callback) { emitter.on(event, callback); };

有没有理由我不能将 on 函数委托给另一个模块中定义的函数?

4

1 回答 1

4

这是一个常见的 JS 错误。请注意,该on方法取决于thisemitter在您的示例中)。但是,您导出的只是函数本身,因此emitter当您稍后调用它时,它的上下文 ( ) 会丢失。

这是此问题的一个小示例:

var someObj = { 
    doSth: function() { console.log(this) } 
};
someObj.doSth(); // "Object { ..."

var doSth = someObj.doSth;
doSth(); // "Window { ..."

当我调用doSthas 的方法时someObj,按预期this引用。someObj在我将函数复制到 后doSththis在浏览器中引用它的新上下文,即全局上下文Window。这就是你的情况。

正如您已经提到的,您必须将emitter上下文绑定到函数。这也可以这样做:

exports.on = emitter.on.bind(emitter);
于 2013-04-13T15:35:59.500 回答