2012-10-05 29 views
1

在下面的代码中,我试图让mydata传递给回调函数。这是我遇到的一个更大问题的示例问题。我假设这是一个范围问题。我的代码有什么问题和/或我应该怎么做?在JavaScript中将全局变量传递给事件回调函数?

var EventEmitter = require('events').EventEmitter; 
var myevent  = new EventEmitter(); 
var mydata  = 'my data!'; 

function myfunc (data, mydata) { 
    console.log(data); 
    console.log(mydata); 
}; 

myevent.on('data', function(data, mydata) {myfunc(data,mydata)}); 

myevent.emit('data', "data!"); 

回报:

data! 
undefined 

我想它返回:

data! 
my data! 
+2

你应该避免命名局部和全局变量相同的名字,因为他们将跟随对方,造成混乱的全局变量全局变量。 – jbabey

+0

如果变量是全局变量(或者'myfunc'可以通过闭包访问它),那么为什么你会关心“通过”呢? – bfavaretto

+0

@bfavaretto我试图模拟一个更大的问题,当时我认为这是一个与事件流和socket.io不同的范围问题。我知道我的event-stream.pipepline.emit应该发出socket.io套接字,这样我才能完成socket.emit(data),这完全是另一个问题。 – EhevuTov

回答

3

我要去作胡乱猜测(因为我不熟悉EventEmitter)说emit的第一个参数是事件的名称,其余参数传递给处理程序。

如果是这样的话,你不会传递任何东西给第二个回调参数,这就是为什么它会以undefined的形式出现。试试这个:

myevent.emit('data', "data!", "mydata!"); 

注意:我忽略了你的影子问题,因为它与问题无关,只是一个不好的做法。

+0

你说得对。我起草了一个简单的例子(如果命名时选择不好),我想用socket.io发送数据,只要我的事件流发出数据,发出相同的数据。 – EhevuTov

5

参数mydata回调的参数列表隐藏着同一个名字的全局变量。

由于您在该位置没有传入任何参数,因此其值为undefined

或者:

  1. 变化的参数的名称,或
  2. 删除参数,或
  3. 传递所需的值,例如myevent.emit('data', "data!", mydata);

PS:

myevent.on('data', function(data, mydata) {myfunc(data,mydata)}); 

会更好只是写为:

myevent.on('data', myfunc); 
+2

3.通过发出呼叫的参数 – Zecc

+0

@Zecc良好的呼叫 - 添加。 – Alnitak

2

修改后的代码:您可以访问全局变量。从任何你不需要传递它作为参数的地方。即使你传递一个参数。您可以访问使用window.mydata,因为你正在使用您的NodeJS可以访问使用global.mydata

var EventEmitter = require('events').EventEmitter; 
var myevent  = new EventEmitter(); 
var mydata  = 'my data!'; 

function myfunc (data) { 
    console.log(data); 
    console.log(mydata); 
}; 

myevent.on('data', myfunc); 

myevent.emit('data', "data!");