2012-10-05 35 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!");