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);
- http.get请求循环closures问题(节点)
- 使用节点和mongoose将新的mongoDB文档从数组中取出的最好方法是什么?
- Javascript / NodeJS:在数组/对象集合中通过id查找特定对象的最佳方法
- 如何在PhantomJS中使用jQuery循环表格行
- 在javascript中维护for循环中的http请求的顺序
- 如何使用node.js和express来从Twitter API迭代client.get
- 用另一个对象深层replace一个对象中的值 – javascript
- MongoDB / NodeJS:每个variables的最大连接数/数据库创build
- NodeJS循环等待callback