如下代码为什么会打印6个6
let i = 0
for(i = 0; i<6; i++){
setTimeout(()=>{
console.log(i)
},0)
}
setTimeout()的毫秒数设置为0,先执行函数调用栈中的代码,再调用定时器。 定时器被放在一个队列中,等待上下文的可执行代码运行完毕后,才开始运行定时器。 代码中先执行for循环,再执行定时器方法时,变量已经全部变成了6,所以输出全部都是6
让上面的代码打印0、1、2、3、4、5的方法
- 利用ES6
for(let i = 0; i<6; i++){
setTimeout(()=>{
console.log(i)
},0)
}
- 利用setTimeout的第三个参数
for (var i=0; i<6; ++i) {
setTimeout(function(i){
console.log(i)
}, 0, i)
}
- 利用闭包
for(var i=0; i<6; ++i) {
!(function(j) {
setTimeout(function(){
console.log(j)
}, 0)
})(i)
}