let i = 0
for(i = 0; i<6; i++){
setTimeout(()=>{
console.log(i)
},0)
} // 6,6,6,6,6,6
以上代码,会打印出6个6,什么原因呢?
这里的i声明在for循环外部,执行完同步任务for循环后,JS引擎开始执行异步任务循环出来的6个setTimeout函数。此时环境里只有一个全局变量i = 6(根据for循环执行顺序,在i=6时跳出for循环),所以6个setTimeout函数都打印了6。
for(let i = 0; i<6; i++){
setTimeout(()=>{
console.log(i)
},0)
} // 0,1,2,3,4,5
这里的代码,就会打印出0,1,2,3,4,5,当for循环中,在小括号中用let声明循环变量,JS引擎会在每一次循环体里单独用let声明一次当时的循环变量,所以每一个setTimeout所在的block(块)里,都有一个let声明的局部变量i,因此打印出0,1,2,3,4,5。可以理解为
for(let i = 0; i<6; i++){
let i = i;
setTimeout(()=>{
console.log(i)
},0)
} // 0,1,2,3,4,5
也可以用立即执行函数实现,
for(var i = 0; i<6; i++){
!function(i){
setTimeout(()=>{
console.log(i)
},0)}(i)
} // 0,1,2,3,4,5