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範圍和異步操作有很好的理解,但是我很難弄清楚導致這種行爲的原因。這與節點模塊加載器的工作方式有關嗎?還是我錯過了一些明顯的東西?任何幫助,將不勝感激。
[JavaScript是傳遞引用還是傳值語言?](https://stackoverflow.com/questions/518000/is-javascript-a-pass-by-reference-or-pass-按價值語言) – Andreas
這很有趣。我知道JavaScript以這種方式傳遞值,但是因爲我沒有明確地傳遞任何參數,所以它不會發生在我身上。所以,即使你只是在父範圍內引用一個變量,也適用相同的規則? – Pancake
當你得到數組的引用時,你不應該像這樣清空它。使用其他方法,如'clientList.lenght = 0'。請參閱:[如何做我的空數組在JavaScript](http://stackoverflow.com/a/1232046/5048383) – dNitro