時(shí)間: 4.12
原文地址:https://juejin.cn/post/6844903512845860872
先前也理解了宏任務(wù)微任務(wù)隊(duì)列,再看看高贊文章差缺補(bǔ)漏一下砚著。
- 在HTML5中提出了Web-Worker蜓陌,模擬了“多線程”。
- 事件循環(huán)是同步任務(wù)先進(jìn)主線程和執(zhí)行完成后回調(diào)異步任務(wù)的循環(huán)過程。
-
setTimeout函數(shù)的執(zhí)行過程
- 內(nèi)部回調(diào)進(jìn)入Event Table且計(jì)時(shí)
- 執(zhí)行下一行同步任務(wù)俺附,繼續(xù)主線程
- 計(jì)時(shí)完成汇恤,內(nèi)部回調(diào)進(jìn)入 Event Queue等待主線程為空后執(zhí)行
總結(jié):setTimeout因?yàn)槭录h(huán)機(jī)制,等待主線程的時(shí)間未知晕窑,是有可能回調(diào)執(zhí)行時(shí)間要大于計(jì)時(shí)時(shí)間。
- setInterval的基礎(chǔ)執(zhí)行過程同setTimeout睹栖,再加循環(huán)而已
坑點(diǎn):如果內(nèi)部回調(diào)執(zhí)行時(shí)間大于計(jì)時(shí)時(shí)間硫惕,那么在內(nèi)部回調(diào)完成后,下一次回調(diào)早已經(jīng)進(jìn)入Event Queue主線程也空出來的了野来,會直接執(zhí)行恼除,而不會有預(yù)期的等待時(shí)間。
- Promise&process.nextTick微任務(wù)
需要注意的是:上述提到事件循環(huán)是同步任務(wù)先進(jìn)主線程和執(zhí)行完成后回調(diào)異步任務(wù)的循環(huán)過程梁只。
宏任務(wù)不在同步任務(wù)之中缚柳,所以宏任務(wù)微任務(wù)的循環(huán),并不適用上述條件搪锣。 -
而是宏任務(wù)執(zhí)行一次完成秋忙,再執(zhí)行完當(dāng)前所有微任務(wù)
所以根據(jù)下圖圖示,是執(zhí)行完setTimeout1构舟,掛起setTimeout2灰追,先去執(zhí)行完現(xiàn)有的所有微任務(wù),完成一次循環(huán)狗超,再回來執(zhí)行setTimeout2.
還有個(gè)很有意思的點(diǎn)弹澎,js的執(zhí)行和運(yùn)行要分開看待,js的解析是運(yùn)行努咐,是由語言定的一致的苦蒿,具體的執(zhí)行就會分環(huán)境有略微不同的表現(xiàn)。
這可以確定渗稍,js就是單線程佩迟,逐行運(yùn)行的,這個(gè)一定不變&宏任務(wù)微任務(wù)循環(huán)是執(zhí)行機(jī)制確定的竿屹,這個(gè)可能會有些許差異报强。
關(guān)鍵詞:模擬多線程、宏任務(wù)微任務(wù)循環(huán)拱燃、setTimeout會因主線程卡住而阻塞秉溉、setInterval也有setTimeout的問題且
會因內(nèi)部函數(shù)卡住而不進(jìn)行下一個(gè)循環(huán)、