js中setTimeout()時間參數(shù)設(shè)置為0的探討

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。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 《ijs》速成開發(fā)手冊3.0 官方用戶交流:iApp開發(fā)交流(1) 239547050iApp開發(fā)交流(2) 10...
    葉染柒丶閱讀 5,634評論 0 7
  • 《ilua》速成開發(fā)手冊3.0 官方用戶交流:iApp開發(fā)交流(1) 239547050iApp開發(fā)交流(2) 1...
    葉染柒丶閱讀 11,479評論 0 11
  • 之前在網(wǎng)上看了很多關(guān)于setTimeout的文章,但我感覺都只是點到為止,并沒有較深入的去剖析,也可能是我腦袋瓜笨...
    Designleiou閱讀 759評論 1 1
  • 周六在上班中! 一想到下周要回家的事,也是頭疼! 不想面對世間的‘紛紛擾擾’,不想面對只會徒加煩惱的世俗,就是想無...
    蘭花大海閱讀 201評論 0 0
  • 1.創(chuàng)建一個動態(tài)web項目工程 需要添加xml 2.引入SpringMvc 需要的JAR包 忘記引一個jar包 然...
    尼爾君閱讀 273評論 0 0

友情鏈接更多精彩內(nèi)容