5分鐘看完文章党涕,即可解決大部分執(zhí)行順序的題目,那些題都是跟事件循環(huán)機(jī)制有關(guān)巡社。(個人水平有限咯膛堤,如有錯誤歡迎指出)
之前寫過一篇,宏任務(wù)與微任務(wù)的執(zhí)行順序晌该,但是這不是根本肥荔,今天我覺得很有必要講一下event loop。
進(jìn)入正題朝群,地球人都知道js是單線程燕耿。那么它可能存在執(zhí)行任務(wù)時候任務(wù)阻塞,Event Loop的出現(xiàn)潜圃,就是完美的解決了這個問題缸棵。
1、首先我們知道js代碼執(zhí)行分為同步任務(wù)
和異步任務(wù)
同步: script代碼塊(如console.log)
異步又分為:
宏任務(wù):setTimeout
谭期、I/O
微任務(wù):promise.then()
堵第、async的await
、new MutationObserver()
我們可以看到它的異步又分為宏任務(wù)與微任務(wù)(面試中經(jīng)常提到的執(zhí)行順序)隧出。
2踏志、調(diào)用棧和任務(wù)隊列
棧
和隊列
的執(zhí)行順序
請看下面圖例,js執(zhí)行任務(wù)時候胀瞪,有個調(diào)用棧用來執(zhí)行代碼针余,兩個任務(wù)隊列(宏任務(wù)、微任務(wù))凄诞,A圆雁、B是兩個函數(shù)。
很容易理解帆谍,棧是先進(jìn)后出伪朽,而隊列則不同,是先進(jìn)先出汛蝙。
到這里對事件循環(huán)的基礎(chǔ)了解有了60%烈涮。接下來就了解知道它是大概怎么執(zhí)行循環(huán)的朴肺。
3、事件循環(huán) Event Loop執(zhí)行順序(重點(diǎn))
上面列舉的代碼模塊按照一定的機(jī)制循環(huán)執(zhí)行坚洽,就是Event Loop戈稿,也叫事件循環(huán)。
要了解它的執(zhí)行順序有兩點(diǎn):
1讶舰、js是在調(diào)用棧里面執(zhí)行鞍盗,執(zhí)行時代碼分為同步任務(wù)
和異步任務(wù)
。同步的先執(zhí)行绘雁,執(zhí)行完了再執(zhí)行異步任務(wù)代碼橡疼。為什么援所?可以理解為不清楚異步是什么時候執(zhí)行完成的庐舟,所以同步代碼先執(zhí)行。
2住拭、接第一點(diǎn)挪略,同步代碼全部執(zhí)行完后
才開始執(zhí)行異步,異步里微任務(wù)比宏任務(wù)先執(zhí)行(理解為微任務(wù)執(zhí)行比較快滔岳,為了方便你記憶)杠娱,直到微任務(wù)隊列沒了,才去執(zhí)行宏任務(wù)谱煤。
假設(shè)有如下代碼塊摊求,我們按照上面的
setTimeout(() => {
console.log(1);
}, 0)
console.log(2)
new Promise((resolve) => {
resolve(3)
}).then(res => console.log(res))
function foo() {
console.log(4);
}
foo()
new Promise((resolve) => {
resolve(6)
}).then(res => console.log(res))
這個代碼塊,執(zhí)行時刘离,第一輪結(jié)束時候室叉,會是如下結(jié)果(所有代碼都會進(jìn)入執(zhí)行棧里執(zhí)行時候彈出,這個過程不畫了):
同步任務(wù)全部執(zhí)行完畢硫惕,直接在控制臺分別打印 2 ---- 4 茧痕,(其實(shí)執(zhí)行期間)異步任務(wù)會分別被分配到
宏任務(wù)隊列
和微任務(wù)隊列
,此時開始執(zhí)行下一輪的任務(wù)事件恼除,第二輪踪旷,我們來看下,它的圖解:微任務(wù)console.log(3)
進(jìn)入執(zhí)行棧豁辉,然后彈出令野,所以在控制臺先輸出3,然后再檢查是否有微任務(wù)徽级,console.log(6)
再進(jìn)入執(zhí)行棧气破,然后彈出,控制臺輸出6灰追。
接著第三輪堵幽,就是剩下宏任務(wù)了狗超,運(yùn)行宏任務(wù)隊列代碼塊console.log(1)
,控制臺輸出1朴下。
所以最終結(jié)果就是:2---4---3---6---1
看到這里了解了嗎努咐?代碼按規(guī)律循環(huán)執(zhí)行這就是 事件循環(huán)Event Loop,有沒有很簡單殴胧。
但是但是但是渗稍,如果只會這點(diǎn)的話不行啦,遇到稍微復(fù)雜一點(diǎn)的循環(huán)就有點(diǎn)蒙团滥,而且竿屹,有坑點(diǎn)
。請看我這篇文章:
js事件循環(huán)簡單理解灸姊,微任務(wù)與宏任務(wù)運(yùn)行順序(二)
看完你會回來感謝我的拱燃。