目前我有一个Node.js模块,格式如下:
var events = require('events');
var emitter = new events.EventEmitter();
function emitSomething() {
emitter.emit("event");
}
exports.emitSomething = emitSomething;
exports.on = emitter.on;
但是,当我调用emitSomething
时,任何通过on
注册的回调都不会被调用。
我可以通过将最后一行改为
exports.on = function(event, callback) { emitter.on(event, callback); };
我不能将on函数委托给另一个模块中定义的函数,有什么原因吗?
发布于 2013-04-13 23:36:00
这是一个常见的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);
https://stackoverflow.com/questions/15987633
复制相似问题