【问题】JS中关于for循环嵌套定时器的注意事项

482 阅读1分钟
for (var i = 0 ; i < 5 ; i++) {
        timer = setInterval(function () {
            console.log(i)
        },1000) 
  }

如上述代码,以为控制台会定时输出0,1,2,3,4

但控制台最后输出的是5个5

原因如下:

首先JS是单线程非阻塞执行机制,而setInterval属于异步函数,代码会优先把异步函数setInterval移到任务队列里

又因为setInterval的定时是1秒,等一秒的时间过去后,for循环已经结束了,并且最后一次的for循环是5

这时定时器setInterval才会开始执行,以5输出。

接下来是解决的方法:

1.让setInterval异步函数不再移到任务队列里,而是立即执行

for (var i = 0 ; i < 5 ; i++) {
        (function (i) {
            setInterval(function () {
                console.log(i)
            },1000)
        }) (i) // 使用闭包
    }

2.不用var 使用let,let是块级作用域,也会排队在任务队列里。