节点arrays范围问题

我觉得这是一个非常愚蠢的问题,但我很难理解为什么我在callback函数中看到奇怪的行为。 我定义了一个名为clientList的数组,我导出并在其他文件中使用。 这里的代码在客户端连接到我的服务器时运行。

当我说clientList.splice或clientList.push,一切都按预期工作,而clinetList数组反映了我在其他需要()它的文件中的变化。但是,如果我说直接分配ClientList(例如clientList = []),那么更改不会反映在其他文件中。 如果我在callback中打印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范围和asynchronous操作有了很好的理解,但是我很难弄清楚是什么导致了这种行为。 这与节点模块加载器的工作方式有关吗? 还是我错过了一些明显的东西? 任何帮助,将不胜感激。

问题正是在这一行:

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

这样做,您不清空数组,但在该variables中分配一个新的。 但是你已经输出了旧的,这是因为它没有反映在其他文件中。

有人已经在注释如何清空数组,在你的情况下,我会使用方法2或3(2是最常见的,我会说)。