【发布时间】:2016-12-21 08:29:47
【问题描述】:
我觉得这是一个非常愚蠢的问题,但我无法理解为什么我会在回调函数中看到奇怪的行为。 我定义了一个名为 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 以这种方式传递值,但由于我没有明确传递任何参数,所以我没有想到。所以即使你只是在父作用域中引用一个变量,同样的规则也适用?
-
当你有一个数组的引用时,你不应该那样清空它。使用其他方法,例如
clientList.lenght=0。见:how-do-i-empty-an-array-in-javascript
标签: javascript arrays node.js scope