let i = 0
for(i = 0; i<6; i++){
setTimeout(()=>{
console.log(i)
},0)
}
这段代码会打印出6个6而非0,1,2,3,4,5,这可能会让人感到疑惑。setTimeout()中的代码会在当前代码执行完后再运行,在这个例子中,for会先完成从0到6的自增,当完成自增之后,由于只有一个变量i,因此循环体中setTimeout()中的console.log(i)会打印出6个6
如何打印出0,1,2,3,4,5?
- 使用先进的let,此处不要将let写在for循环体外,因为只有如下这么写时,JS会做特殊操作,每次循环新建一个变量i
for(let i = 0; i<6; i++){ setTimeout(()=>{ console.log(i) },0) }
- 将setTimeout抽离以让它立刻执行
for(let i = 0; i<6; i++){ fn(i); }
function fn(i){
setTimeout(()=>{ console.log(i) },0);
}
试试在浏览器中运行吧