for(var i =0;i<5;i++){(function(i){setTimeout(function(){console.log(i);},1000)})(i)}会每隔一秒
时间: 2024-05-19 19:11:26 浏览: 12
打印出一个数字,依次为 0,1,2,3,4。这是因为在循环中使用了立即执行函数表达式(IIFE),每个 IIFE 都会创建一个新的作用域,并将 i 的值作为参数传入,防止因为闭包导致的 i 值错误。同时,使用了 setTimeout() 函数来延迟执行打印语句,每个 setTimeout() 函数都会在相应的延迟后执行。因此,整个循环会在 5 秒钟后完成打印。
相关问题
for(var i=0;i<=5;i++){ setTimeout(function(){ console.log(i) },100) }
这段代码的输出结果会是:
```
6
6
6
6
6
6
```
虽然定时器的延时时间是100毫秒,但是由于JavaScript是单线程执行的,for循环中的代码会在主线程中立即执行完毕,因此会立即输出6个6的结果。
在使用var声明变量时,变量i是函数作用域,而不是块级作用域,因此在循环结束后,变量i的值已经变成了6。而定时器中的回调函数只有在循环结束后才会执行,因此在执行回调函数时,会访问到变量i的最终值6。因此输出的结果都是6。
for (var i = 0; i < 5; i++) { setTimeout(function() { console.log(i); }, 1000*i) }
这段代码会输出以下内容:
5
5
5
5
5
这是因为在循环中的setTimeout函数是异步的,它会在循环结束后才执行。因此,当函数执行时,变量i已经被循环到了5,所以会输出5五次。
为了解决这个问题,可以使用闭包来保留变量i的值,或者使用let关键字将变量i声明为块级作用域。例如:
// 使用闭包
for (var i = 0; i < 5; i++) {
(function(i) {
setTimeout(function() {
console.log(i);
}, 1000*i)
})(i);
}
// 使用let
for (let i = 0; i < 5; i++) {
setTimeout(function() {
console.log(i);
}, 1000*i)
}