面完騰訊微信后(涼了)遵岩,發(fā)現(xiàn)自己的知識(shí)很多都沒(méi)有形成比較高的層面上的理解趁窃,這是其中一道題:“了解事件循環(huán)嗎旋廷?”
因?yàn)槭?strong>總監(jiān)面,關(guān)于講解事件循環(huán)機(jī)制來(lái)講狈网,可能需要從大一點(diǎn)的方面去進(jìn)行說(shuō)明(以下為個(gè)人理解)
- 了解一個(gè)點(diǎn)宙搬,那就是JavaScript運(yùn)行的時(shí)候是單線程。當(dāng)運(yùn)行過(guò)于龐大的任務(wù)時(shí)孙援,會(huì)導(dǎo)致網(wǎng)頁(yè)無(wú)響應(yīng)害淤。因此JS中就出現(xiàn)了異步機(jī)制,為了能夠執(zhí)行這些異步任務(wù)拓售,也就出現(xiàn)了事件循環(huán)窥摄。
- 事件循環(huán)過(guò)程中,首先運(yùn)行主程序础淤,執(zhí)行過(guò)程中崭放,遇到setTimeout,setInterval的話,就把這些函數(shù)中對(duì)應(yīng)的任務(wù)放到宏任務(wù)異步等待隊(duì)列鸽凶,如果在運(yùn)行宏任務(wù)的過(guò)程中币砂,遇到用Promise機(jī)制包裹的任務(wù),或者是async和await內(nèi)部產(chǎn)生的promise任務(wù)玻侥,或者是process.nextTick决摧,就把這這些任務(wù)放到一個(gè)宏任務(wù)對(duì)應(yīng)的微任務(wù)等待隊(duì)列中,當(dāng)當(dāng)前的宏任務(wù)執(zhí)行完成后,執(zhí)行對(duì)應(yīng)的微任務(wù)隊(duì)列中的任務(wù)掌桩。
- 遵照上述的原則進(jìn)行循環(huán)边锁。
可以看看以下的圖片: