Я чувствую, что это довольно глупый вопрос, но мне трудно понять, почему я вижу странное поведение в функции обратного вызова. Я определил массив, называемый 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
Когда у вас есть refrences массиву, вы не должны его пустить. используйте другие методы, такие как 'clientList.lenght = 0'. Смотрите: [how-do-i-empty-a-array-in-javascript] (http://stackoverflow.com/a/1232046/5048383) – dNitro