JS的for循環(huán)包裹異步函數(shù)的問題
for (var i=0; i<5; i++)
?{? console.log(i)? }
結(jié)果:0,1,2,3,4
for (var i=0; i<5; i++)
?{?
????setTimeout(?
function(){
?console.log(i)?
},0 ) }
結(jié)果:5,5,5,5,5
雖然setTimeout函數(shù)在每次循環(huán)的開始就調(diào)用了,但是卻被放到循環(huán)結(jié)束才執(zhí)行,循環(huán)結(jié)束,此時i=5,接連打印了5次5。
這里涉及到j(luò)avascript單線程執(zhí)行的問題:javascript在瀏覽器中是單線程執(zhí)行的,必須在完成當(dāng)前任務(wù)后才執(zhí)行隊列中的下一個任務(wù)。
另外,對于javascript還維護(hù)著一個setTimeout隊列,未執(zhí)行的setTimeout任務(wù)就按出現(xiàn)的順序放到setTimeout隊列,等待普通的任務(wù)隊列中的任務(wù)執(zhí)行完才開始按順序執(zhí)行積累在setTimeout中的任務(wù)。
所以在這個問題里,將setTimeout任務(wù)放到setTimeout任務(wù)隊列,等循環(huán)中的打印任務(wù)執(zhí)行完了,才開始執(zhí)行setTimeout隊列中的函數(shù),所以在最后會接著打印5次5。