在访问数组

时间:2016-10-05 07:29:07

标签: javascript arrays node.js foreach

我正在尝试学习Node.js.我动态构建了一个数组,我使用push在每个元素中放置一个函数。

var arr=[];
for(var x=0;x<8;x++)
    arr.push(function(){ console.log(x); });

我想'我正在将一个匿名函数推入到数组中,在调用时应该在迭代期间向控制台打印'x'的值。 IE第一次迭代x == 0,第二次x == 1等等,直到第8次迭代,这意味着推送的最大数量应为7.然后尝试使用forEach循环将每个元素打印到控制台

arr.forEach(function(ar)
     { 
       ar(); 
     });

我认为'这个循环将从元素[0]迭代到数组的末尾。在每次迭代中,我都会调用该元素的函数。 ar();我以为我会将数字0,1,2,3 ... 7打印到控制台,每个数字都在新行上。

对于每次迭代,数字8将打印到控制台的新行。

8号不应该是7吗?为什么只有8张被打印? 发生了什么事?

如果我没有将一个函数推入数组但是按下x并使用forEach循环来调试console.log,则会打印正确的数字。

1 个答案:

答案 0 :(得分:0)

这是因为您的回调函数无法在其范围内找到“x”变量(LexicalEnvironment)并在全局范围内搜索它。 在全局范围内,您的“x”值保存循环的最后一个值,即8。

因此,每次在第二个循环中,它从全局范围获取相同的值。 尝试更改您的代码:

 arr.push((function(x){ console.log(x); })(x));

我们在这里做的是将每个迭代的新值作为参数传递给函数(将其保存到函数的LexicalEnvironment)并立即执行它(检查IIFE)。

了解Javascript中的closures及其运作方式。