这是一段代码,在执行时以一秒的间隔给出6次,5次。有人可以详细向我解释一下吗?
for (var i=1; i<=5; i++) {
setTimeout( function timer(){
console.log( i );
}, i*1000 );
}
答案 0 :(得分:1)
变量i
是timer
函数闭包的一部分。
执行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
在{}
内创建了自己的范围。
for (let i=1; i<=5; i++) {
setTimeout( function timer(){
console.log( i );
}, i*1000 );
}
&#13;