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是块级作用域,也会排队在任务队列里。