以下代码居然会打印出6个6
let i = 0
for (i = 0; i < 6; i++){
setTimeout(()=> {
console.log(i)
},0)
}
当第一次看见这个代码时,我理所当然的认为应该会打印出 0,1,2,3,4,5 但在chrome中运行时,却惊讶地发现该代码会打印出6个6

因为,此时的i是全局变量,每次进行for循环,i都会改变,循环完成时,i为6,此时打印,当然会打印出6个6。
for (let i = 0; i < 6; i++){
setTimeout(()=> {
console.log(i)
},0)
}
当我们运行以上代码时,我们会发现,chrome会打印出 0,1,2,3,4,5
那么,这又是为什么呢?
因为,let 声明的i是局部变量,每次声明i,都相当于在一个新的块中生成了一个i,那么,此时打印,就会显示0,1,2,3,4,5
除了使用let,我们还可以利用闭包来解决这一问题
let i = 0
for (i = 0; i < 6; i++){
setTimeout((j)=> {
console.log(j)
},0,(i))
}
我们将每次for循环出来的i,重新作为参数传给j,也可以解决打印出6个6的问题!
function timer(i){
setTimeout(console.log(i))
}
for(i = 0; i < 6; i++){
timer.call(undefined,i)
}
同时,我们也可以将for循环 和计时打印拆分来解决6个6的问题