5.下面代码输出什么: for(var i = 0;i<5;i++) { setTimeout(()=>{ console.log(i) }) } 答案:5 如果要输出0到4怎么修改?
时间: 2023-06-24 22:03:57 浏览: 113
可以使用立即执行函数(IIFE)将当前的i值保存在一个新的作用域中,每次循环取出对应的值,如下所示:
```
for(var i = 0; i < 5; i++) {
(function(j) {
setTimeout(() => {
console.log(j)
});
})(i);
}
```
或者可以使用ES6中的let关键字,let关键字会在每次循环迭代时创建一个新的绑定,从而避免了闭包的问题,如下所示:
```
for(let i = 0; i < 5; i++) {
setTimeout(() => {
console.log(i)
});
}
```
相关问题
下面的代码输出结果为: for(var i=0;i<3;i++){ setTimeout(function(){ console.log(i) },1000) }
这段代码的输出结果为:
```
3
3
3
```
原因是因为 `setTimeout()` 方法是异步的,每个函数都在循环结束后执行,此时 `i` 的值已经变成了 3。为了得到期望的输出结果,可以使用闭包来保存每个循环的 `i` 值,例如:
```
for (var i = 0; i < 3; i++) {
(function(i) {
setTimeout(function() {
console.log(i);
}, 1000);
})(i);
}
```
这样输出结果就是:
```
0
1
2
```
for(var i=0; i<5; ++i) {settimeout(()=>console.log(i)),0} 这段代码的执行原理以及输出结果
这段代码的执行原理是,使用 `for` 循环语句,每次循环使用 `setTimeout` 函数将 `console.log(i)` 添加到任务队列中,而 `setTimeout` 函数的第二个参数是等待时间,这里设置为0,表示不需要等待,即立即执行。由于JS是单线程执行的,因此 `console.log(i)` 任务无法立即执行,而是需要等到当前代码执行结束后才能执行。
由于 `for` 循环是同步执行的,因此在添加任务时,`i` 的值已经变成了5,因此最终输出的结果是连续的五个数字5,即:
```
5
5
5
5
5
```
阅读全文