这是一段代码,它在一秒钟内执行6到5次。有没有人能给我详细解释一下?
for (var i=1; i<=5; i++) {
setTimeout( function timer(){
console.log( i );
}, i*1000 );
}发布于 2017-12-09 21:46:09
变量i是timer函数闭包的一部分。当执行timer函数时,它将打印当时i的值。当发生这种情况时,循环已经完成,因此i的值为6。对于timer的所有5次执行,您将看到6打印了5次。你还能期待什么呢?
如果您想打印1,2,...,5之间的计数值,然后使用立即求值的函数表达式将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都是在内部函数的闭包中定义的,并且在for循环的每次迭代中都会创建一个不同的value实例,迭代时的值为i。这是与问题中的代码的关键区别。
https://stackoverflow.com/questions/47729160
复制相似问题