Javascript Nodejs EventEmitter-定义侦听器函数的作用域

Javascript Nodejs EventEmitter-定义侦听器函数的作用域,javascript,node.js,scope,eventemitter,Javascript,Node.js,Scope,Eventemitter,我想做一些像这样的工作: var Events=require('events'), test=new Events.EventEmitter, scope={ prop:true }; test.on('event',function() { console.log(this.prop===true);//would log true }); test.emit.call(scope,'event'); 但是,不幸的是,听众甚至没有接到电话。有

我想做一些像这样的工作:

var Events=require('events'),
    test=new Events.EventEmitter,
    scope={
        prop:true
    };

test.on('event',function() {
   console.log(this.prop===true);//would log true
});
test.emit.call(scope,'event');
但是,不幸的是,听众甚至没有接到电话。有没有什么方法可以用EventEmitter来实现这一点?我可以
Function.bind
到监听器,但是,我真的希望
EventEmitter
有一些特殊的(或明显的;)方法来做到这一点


谢谢你的帮助

这将不起作用,并且emit只有一种方便的方法来传递参数,但没有一种方法用于设置
。看来你得自己装订了。但是,您可以将其作为参数传递:

test.on('event',function(self) {
   console.log(self.prop===true);//would log true
});
test.emit('event', scope);

否,因为侦听器中的
值是事件发射器对象

然而,你能做的是

var scope = {
  ...
};
scope._events = test._events;
test.emit.call(scope, ...);

您的事件处理程序没有被调用的原因是,所有的处理程序都存储在
\u events
中,因此,如果您复制
\u events
,它应该可以工作。

当Google在NPM中搜索处理此问题的包时,我看到了这篇文章:

var ScopedEventEmitter = require("scoped-event-emitter"),
    myScope = {},
    emitter = new ScopedEventEmitter(myScope);

emitter.on("foo", function() {
    assert(this === myScope);
});

emitter.emit("foo");

完全公开,这是我写的一个包。我需要它,这样我就可以拥有一个具有EventEmitter属性的对象,该属性为包含对象发射。NPM包页面:

Doh,现在看起来很明显。感谢您的点睛之笔:)。由于在EventEmitter扩展的对象上创建的_events属性不是其文档化的公共界面的一部分,这是明智的建议吗?@RobRaisch否,但它不太可能改变。到目前为止,对于节点0.10.38、0.12.4和IO.JS 2.2.1,这种方法仍然可以正常工作。时间证明:)回答得很好!非常感谢。像这样简单!然而,不幸的是,如果emit不在您的控制之下,但是框架在您的控制之下,那么这并不能解决问题。所有的证据都与此相反。4年后,被接受的答案在Node JS的每个版本中都被证明是有效的:0.10.38、0.12.4、IO.JS 2.2.1。工作起来很有魅力:)被接受的答案非常有效,不需要整个额外的库:)这叫做代码重用。“整个额外库”是一个37行的Javascript文件,但因为它是一个已发布的包,所以您可以在许多项目中使用它,而无需寻找您添加了可接受答案的项目。此外,发布时,接受的答案不存在。