node.js:循环中的闭包

我无法得到closures的挂钩。 一个非常简单的例子:

var array = [1,2,3]; var test = [0,0]; var result = []; for (var i=1; i<=array.length; i++){ test[1] = i; result.push(test); } console.log(result); 

如果我只是把“我”推到结果中,它输出“1,2,3”,但上面的方法总是得到“[0,3],[0,3] [0,3]”。 这是为什么? 我已经阅读了关于闭包的一些解释,但是我似乎不理解这个系统,这使得我很难在代码中发现更多的错误。 是不是有一个更简单的方法来解决上面的问题,而不是使用函数内的函数(这似乎是解决我所发现的每一个相同的问题)?

您正在编写相同的实例结果,并且在该实例中更改参数时,结果中的所有实例都将被更改。 您需要创build单独的实例来保存数据,这里是代码来说明正确的方式来做到这一点

 var array = [1,2,3]; var test = [0,0]; var result = []; for (var i=1; i<=array.length; i++){ var z = [test[0], i]; result.push(z); } console.log(result); 

重点是当你在JavaScript中replace数组,它不是复制,而是给出一个链接到数组。 所以

 var testArray = [1,2,3]; var copy = testArray; copy[1] = 10; console.log(testArray); // [1,10,3] 

为了避免这种情况,可以通过.concat()或.slice()来“复制”数组。

 var testArray = [1,2,3]; var copy = testArray.concat(); // or Array.slice(0) copy[1] = 10; console.log(testArray) // [1,2,3] 

所以你的代码会

 var array = [1,2,3]; var test = [0,0]; var result = []; for (var i=1; i<=array.length; i++){ test[1] = i; result.push(test.concat()); } console.log(result);