for (var i = 0; i < 5; i++) { setTimeout(function(){console.log('i:',i); },1000) } console.log(i);,为什么打印了5个i
时间: 2024-09-12 08:14:37 浏览: 51
实例讲解JS中setTimeout()的用法
这段JavaScript代码中使用了`for`循环结合`setTimeout`函数。`setTimeout`用于在指定的毫秒数后执行一个函数。这里的`for`循环会立即开始执行,并且在每次迭代时,都会将一个`setTimeout`调用加入到JavaScript的事件队列中。然而,这些`setTimeout`的回调函数不会立即执行,因为它们被设置为在事件队列中等待1000毫秒。
关键点在于变量`i`在`for`循环中被所有`setTimeout`回调共享,而且这些回调函数是在`for`循环完成之后才被执行的。当`for`循环结束后,变量`i`的值是5,因为这是循环的终止条件(`i < 5`)不再满足时`i`的值。由于回调函数共享了同一个`i`变量,所以当它们最终执行时,它们都打印出当前的`i`值,也就是5。
`console.log(i);`这行代码在`for`循环之外,它会立即执行,打印出`for`循环结束后`i`的最终值。
为了修正这个问题,使得每个`setTimeout`回调打印出不同的`i`值,可以使用一个立即执行的函数表达式(IIFE)来创建一个新的作用域,从而捕获每次迭代的`i`值。以下是修正后的代码示例:
```javascript
for (var i = 0; i < 5; i++) {
(function(i) {
setTimeout(function() {
console.log('i:', i);
}, 1000);
})(i);
}
```
在这个修正后的代码中,每次循环时都会立即执行一个IIFE,它接收当前的`i`值作为参数。这个参数在IIFE内部被引用,因此每个`setTimeout`回调都各自拥有一个封闭的`i`值的副本。
阅读全文