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