先上一張自己理解的畫出的圖
1作谭、
js引擎執(zhí)行js代碼是單線程的稽物,也就是只有一個主線程上在執(zhí)行著代碼。
2折欠、
執(zhí)行的任務(wù)分為同步任務(wù)和異步任務(wù)贝或,先執(zhí)行同步任務(wù)吼过。主線程會先將異步任務(wù)放到事件隊列中(掛起)
同步任務(wù)中,遇到函數(shù)咪奖,在執(zhí)行函數(shù)的時候盗忱,會形成當前函數(shù)的局部作用域,也就是執(zhí)行上下文羊赵。 在該上下文中會聲明變量趟佃,參數(shù),this值確定昧捷。如果有其他的函數(shù)闲昭,只能等待執(zhí)行,一個一個的排隊等 待執(zhí)行靡挥,行成函數(shù)調(diào)用棧。
3跋破、
同步任務(wù)執(zhí)行完成以后,主線程會去事件隊列中尋找有沒有異步任務(wù)幔烛。異步任務(wù)又分為微任務(wù)和宏任務(wù)啃擦。
補充:js會先執(zhí)行宏任務(wù)饿悬,然后將宏任務(wù)的回調(diào)推入事件隊列中,然后再執(zhí)行微任務(wù)狡恬,再將微任務(wù)的回調(diào)推入事件隊列中。執(zhí)行完宏任務(wù)微任務(wù)得到結(jié)果以后弟劲,js內(nèi)部的其他線程會通知主線程任務(wù)執(zhí)行完畢祷安,可以到事件隊列中調(diào)取回調(diào)了兔乞。從事件隊列中,是先調(diào)取微任務(wù)的回調(diào)庸追,所有微任務(wù)的回調(diào)調(diào)取完畢,再去調(diào)取宏任務(wù)的回調(diào)淡溯,直到事件隊列為空。注意執(zhí)行任務(wù)的順序和調(diào)取回調(diào)的順序是相反的
先執(zhí)行事件隊列中所有微任務(wù)的回調(diào)(比如promise)咱娶,微任務(wù)回調(diào)執(zhí)行完以后再去執(zhí)行宏任務(wù)回調(diào)(比如setTimeout)米间。宏任務(wù) 當中可能又包含微任務(wù)强品,這樣一直執(zhí)行下去,直到事件隊列為空結(jié)束屈糊。
4的榛、
以上四步行成整個事件循環(huán)的過程
Node的事件循環(huán)暫且先不寫,之后深入了解Node再來補充另玖。