前端每日一解 - setTimeout的执行顺序
先解釋一下主任務(wù)、微任務(wù)和宏任務(wù)的概念。
因為JS是單線程,代碼中所有同步任務(wù)(后面統(tǒng)一稱為主任務(wù))都在主線程上執(zhí)行,形成一個執(zhí)行棧,棧是先進(jìn)后出的。代碼跑起來以后會先執(zhí)行棧中的主任務(wù)直到所有任務(wù)執(zhí)行完畢;當(dāng)遇到異步任務(wù)時,它會被單獨放到異步執(zhí)行隊列中去,這里的異步任務(wù)又分為宏任務(wù)和微任務(wù),有一個宏任務(wù)隊列和一個微任務(wù)隊列,隊列是先進(jìn)先出的。
在異步任務(wù)中,微任務(wù)優(yōu)于宏任務(wù)執(zhí)行,當(dāng)主任務(wù)執(zhí)行完畢后先去查看微任務(wù)隊列中是否有東西,有則主線程讀取微任務(wù)隊列中的所有內(nèi)容按順序執(zhí)行完畢(這個過程中遇到了異步任務(wù)也是要放到兩個異步隊列的末尾的,后面主線程中內(nèi)容執(zhí)行完畢后又會去讀取,所以可能產(chǎn)生事件循環(huán)Event Loop,這是前端必須了解的一個概念)。當(dāng)主任務(wù)棧和微任務(wù)隊列中沒有內(nèi)容了,主線程才會讀取宏任務(wù)隊列中的所有內(nèi)容按順序執(zhí)行完畢。
所以,執(zhí)行順序:主任務(wù)?> 微任務(wù)?> 宏任務(wù)?
而setTimeout屬于異步任務(wù)中的宏任務(wù)。當(dāng)代碼按順序讀到setTimeout函數(shù)時,會執(zhí)行它開始計時,計時完成后把setTimeout函數(shù)里面的內(nèi)容放入宏任務(wù)隊列中等待后續(xù)被主線程讀取。
總結(jié)
以上是生活随笔為你收集整理的前端每日一解 - setTimeout的执行顺序的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 企业级软件系统开发为何这么贵?
- 下一篇: xxl-job的使用实例