Js setTimeout小问题

做项目的时候发现了一个setTimeout问题,比如以下代码:

1
2
3
4
5
for(var i=0;i<10;i++){
setTimeout(function(){
console.log(i)
},1000*i)
}

本意我是想让这个for循环每隔1秒延时后打印一次i的值,结果是每隔一秒打印了10,打印了10个10,对此我表示不求甚解

产生原因


因为setTimeout是异步执行的,所以整个for循环其实是设置了10个定时器去打印i的值,而此时i的值早已经变成了10,可能有人会问为什么不是9,那是因为10次循环之后i++了变成了10,所以说控制台打印10个10,那么如何才能让控制台每隔一秒打印i了

解决办法


方法一 把计时器放到一个匿名函数里面,把i当参数传进去,这样计时器里面的i不会受到全局变量i的影响了,代码如下:

1
2
3
4
5
6
7
for (var i = 0; i < 10; i++) {
(function(i) {
setTimeout(function() {
console.log(i)
}, 1000 * i)
})(i)
}

方法二 结合使用ES6,使用let把i变成一个局部变量,代码如下:

1
2
3
4
5
for (let i = 0; i < 10; i++) {
setTimeout(function() {
console.log(i)
}, 1000 * i)
}

如果您觉得我的文章对您有用,请随意打赏。

您的支持将鼓励我继续创作!

¥ 打赏支持

文章导航

目录

×
  1. 1. 产生原因
  2. 2. 解决办法