2016-12-21 27 views
1

我覺得這是一個非常愚蠢的問題,但我很難理解爲什麼我在回調函數中看到奇怪的行爲。 我定義了一個名爲clientList的數組,我將其導出並用於其他文件。此代碼在客戶端連接到我的服務器時運行。當我說clientList.splice或clientList.push,一切都按預期工作,而clinetList數組反映了我在需要()它的其他文件中的變化。但是,如果我說直接分配ClientList(例如clientList = [ ]),那麼該更改不會反映在其他文件中。如果我在回調中打印ClientList的內容,則更改將以任何方式反映出來。節點數組作用域問題

var clientList = []; 

module.exports.socketHandler = (socket) => { 
var client = new Client(socket); 
clientList.push(client); 

socket.on('end',function(){ 
    clientList = [] //This does not change the exported array 
    clientList.splice(0,1); //This does change the exported array 
    console.log("Client connection ended: "+clientList.length); //This always changes 
}); 

} 

module.exports.clientList = clientList; 


//IN A DIFFERENT FILE 
//This code is run every few seconds on a loop 
var example = require('./sockets.js'); 
console.log("Array Size: "+example.clientList.length); 

我的問題是爲什麼這裏有區別。我對JavaScript範圍和異步操作有很好的理解,但是我很難弄清楚導致這種行爲的原因。這與節點模塊加載器的工作方式有關嗎?還是我錯過了一些明顯的東西?任何幫助,將不勝感激。

+2

[JavaScript是傳遞引​​用還是傳值語言?](https://stackoverflow.com/questions/518000/is-javascript-a-pass-by-reference-or-pass-按價值語言) – Andreas

+0

這很有趣。我知道JavaScript以這種方式傳遞值,但是因爲我沒有明確地傳遞任何參數,所以它不會發生在我身上。所以,即使你只是在父範圍內引用一個變量,也適用相同的規則? – Pancake

+1

當你得到數組的引用時,你不應該像這樣清空它。使用其他方法,如'clientList.lenght = 0'。請參閱:[如何做我的空數組在JavaScript](http://stackoverflow.com/a/1232046/5048383) – dNitro

回答

1

的問題恰恰是在這一行:

clientList = [] //This does not change the exported array 

這樣做,你不排空陣列,但在分配變量一個新的。但是你已經輸出了舊的,這是因爲它沒有反映在其他文件中。

有人已經在comments如何清空數組,在你的情況下我會使用方法2或3(2是最常見的我會說)。