先看代碼,猜測(cè)一下會(huì)打印出什么
let i = 0
for(i = 0; i<6; i++){
setTimeout(()=>{
console.log(i)
},0)
}
打印結(jié)果玻佩,如圖
對(duì)的出嘹,會(huì)打印出6個(gè)6,為什么會(huì)這樣呢咬崔,不應(yīng)該是打印出0-5嘛
解釋如下:i = 0税稼,i < 6,開始循環(huán)垮斯,然后setTimeout并不會(huì)執(zhí)行郎仆,跳過setTimeout,進(jìn)入下一次循環(huán)兜蠕,i++ = 1扰肌,i < 6,跳過setTimeout熊杨。曙旭。墩剖。。夷狰。岭皂。直到i++ = 6,i 不小于6沼头,循環(huán)結(jié)束爷绘,開始執(zhí)行setTimeout,第一次執(zhí)行setTimeout进倍,i 的值為6土至,第二次執(zhí)行setTimeout,i 的值為6猾昆,一共執(zhí)行六次陶因,所以打印出6個(gè)6。簡(jiǎn)而言之垂蜗,循環(huán)先執(zhí)行楷扬,執(zhí)行六次后,此時(shí) i 為6贴见,再去執(zhí)行setTimeout烘苹,執(zhí)行六次,最后打印出6個(gè)6
我們可以用下面的方法解決
1.去掉最外面的let i = 0
for(let i = 0; i<6; i++){
setTimeout(()=>{
console.log(i)
},0)
}
2.使用閉包
let i
for(i = 0; i<6; i++){
!function(j){
setTimeout(()=>{
console.log(j)
},0)
}(i)
}
3.利用 setTimeout 的第三個(gè)參數(shù),將i傳進(jìn)去
let i;
for(i = 0; i<6; i++){
!function(j){
setTimeout(()=>{
console.log(j)
},0)
}(i)
}
4.利用 const 關(guān)鍵字
let i
for(i = 0; i<6; i++){
const x = i
setTimeout(()=>{
console.log(x)
})
}
部分答案來自于知乎