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é)束普气,此時(shí)i=5,接連打印了5次5氏涩。
這里涉及到j(luò)avascript單線程執(zhí)行的問題:javascript在瀏覽器中是單線程執(zhí)行的兔港,必須在完成當(dāng)前任務(wù)后才執(zhí)行隊(duì)列中的下一個(gè)任務(wù)。
另外粒梦,對于javascript還維護(hù)著一個(gè)setTimeout隊(duì)列土童,未執(zhí)行的setTimeout任務(wù)就按出現(xiàn)的順序放到setTimeout隊(duì)列,等待普通的任務(wù)隊(duì)列中的任務(wù)執(zhí)行完才開始按順序執(zhí)行積累在setTimeout中的任務(wù)弯屈。
所以在這個(gè)問題里蜗帜,將setTimeout任務(wù)放到setTimeout任務(wù)隊(duì)列,等循環(huán)中的打印任務(wù)執(zhí)行完了资厉,才開始執(zhí)行setTimeout隊(duì)列中的函數(shù)厅缺,所以在最后會接著打印5次5。