目前我有一个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函数委托给另一个模块中定义的函数?
答案 0 :(得分:3)
这是一个常见的JS错误。请注意,on
方法取决于this
(在您的示例中为emitter
)。但是,您导出的只是函数本身,所以当您稍后调用它时,它的上下文(emitter
)会丢失。
以下是此问题的一个小示例:
var someObj = {
doSth: function() { console.log(this) }
};
someObj.doSth(); // "Object { ..."
var doSth = someObj.doSth;
doSth(); // "Window { ..."
当我将doSth
称为someObj
的方法时,this
按预期引用someObj
。将函数复制到doSth
后,this
引用它的新上下文,在浏览器中引用全局上下文Window
。这就是你的情况。
正如您已经提到的,您必须将emitter
上下文绑定到该函数。这也可以这样做:
exports.on = emitter.on.bind(emitter);