为什么以及如何在执行时将这段Javascript代码打印5次?

时间:2017-12-09 13:42:32

标签: javascript

这是一段代码,在执行时以一秒的间隔给出6次,5次。有人可以详细向我解释一下吗?

for (var i=1; i<=5; i++) {
    setTimeout( function timer(){
        console.log( i );
        }, i*1000 );
}

2 个答案:

答案 0 :(得分:1)

变量itimer函数闭包的一部分。 执行timer函数时 它会在那时打印i 的值。 到那时,循环已经完成, 所以i的值是6。 对于timer的所有5次执行, 所以你看到6次打印5次。 您还期待什么?

如果您想打印1,2或......之间的计数,其间有超时, 然后将当前具体值i传递给闭包, 使用立即评估的函数表达式:

for (var i = 1; i <= 5; i++) {
  setTimeout(function (value) {
    return function timer() {
      console.log(value);
    }
  }(i), i*1000);
}

另一个等效变体:

for (var i = 1; i <= 5; i++) {
  (function () {
    var value = i;
    setTimeout(function timer() {
      console.log(value);
    }, i*1000);
  })()
}

请注意,在两个示例中,变量value在内部函数的闭包中定义,并且在value循环的每次迭代中都创建了for的不同实例, 在迭代时使用i的值。 这是与问题中代码的重要区别。

答案 1 :(得分:0)

当您的setTimeout()开始执行时i的值已经6。使用let代替var获取所需的输出,因为let{}内创建了自己的范围。

&#13;
&#13;
for (let i=1; i<=5; i++) {
    setTimeout( function timer(){
        console.log( i );
        }, i*1000 );
}
&#13;
&#13;
&#13;