我有以下带有预期和实际输出的小代码段。我的问题很简单。为什么要按此顺序打印?以及如何打印预期的输出?



预期结果:

0
1
2
0
1
2


实际结果:

0
1
2
3
3
3


这是代码:

var functions = [];

for (var i=0; i<10; i++) {
  console.log (i);
  functions.push (function () {
    console.log (i);
  });
};

for (var j=0; j<functions.length; j++) {
  functions[j] ();
};

最佳答案

推入数组的函数不会像创建函数时那样记录i的值,而是在调用该函数时记录i的值。

一旦第一个循环结束,i的值就是10,因此此后调用的任何函数都将记录值10

如果要在不同状态下保留i的值,则可以使用闭包制作该值的副本:

for (var i=0; i<10; i++) {
  console.log (i);

  (function(){
    var copy = i;

    functions.push (function () {
      console.log (copy);
    });

  })();

};


局部变量copy将获取i的值并保留该值。您还可以将值作为参数传递给函数:

for (var i=0; i<10; i++) {
  console.log (i);

  (function(copy){

    functions.push (function () {
      console.log (copy);
    });

  })(i);

};

关于javascript - javascript函数中的var作用域,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12903969/

10-12 06:33