摘要:簡(jiǎn)介我把在瀏覽器中運(yùn)行主要分為以下幾種類(lèi)型的任務(wù)同步任務(wù)同步任務(wù)是指按照正常順序執(zhí)行的代碼,比如函數(shù)調(diào)用,數(shù)值運(yùn)算等等,只要是執(zhí)行后立即能夠得到結(jié)果的就是同步任務(wù)。取出微任務(wù)隊(duì)列中的任務(wù)執(zhí)行,直到隊(duì)列被完全清空重復(fù)和,直到宏任務(wù)隊(duì)列被清空。
簡(jiǎn)介
? 我把JavaScript在瀏覽器中運(yùn)行主要分為以下幾種類(lèi)型的任務(wù):
同步任務(wù)(MainTask) :同步任務(wù)是指JavaScript按照正常順序執(zhí)行的代碼,比如:函數(shù)調(diào)用,數(shù)值運(yùn)算等等,只要是執(zhí)行后立即能夠得到結(jié)果的就是同步任務(wù)。
宏任務(wù) (MacroTask):setTimeout、setInterval、I/O、UI渲染
微任務(wù) (MicroTask) :Promise、Object.obsever、MutationObsever
用戶交互事件(User Interaction Event):點(diǎn)擊事件onclick、鍵盤(pán)事件onkeywodn、鼠標(biāo)事件onmouseover等等
執(zhí)行順序具體流程:
執(zhí)行完主邏輯中的同步任務(wù)
取出微任務(wù)隊(duì)列(MicroTask Queue)中的任務(wù)執(zhí)行,直到隊(duì)列被完全清空
取出宏任務(wù)隊(duì)列(MacroTask Queue)中的一個(gè)任務(wù)執(zhí)行。
取出微任務(wù)隊(duì)列(MicroTask Queue)中的任務(wù)執(zhí)行,直到隊(duì)列被完全清空
重復(fù) 3 和 4,直到宏任務(wù)隊(duì)列(MacroTask Queue)被清空。
demo1:宏任務(wù)(MacroTask)和微任務(wù)(MicroTask)執(zhí)行順序demo1.html
demo1:宏任務(wù)(MacroTask)和微任務(wù)(MicroTask)執(zhí)行順序
運(yùn)行結(jié)果:
以上代碼詳細(xì)的運(yùn)行步驟隊(duì)列圖,我已經(jīng)寫(xiě)成了PPT,大家可以下載打開(kāi)看效果,可以詳細(xì)了解每一段代碼在隊(duì)列中的樣子:
https://github.com/Jameswain/...
demo2:setInterval —— setTimeout的語(yǔ)法糖? setInterval其實(shí)可以說(shuō)是setTimeout的語(yǔ)法糖,因?yàn)閟etInterval能夠?qū)崿F(xiàn)的功能,setTimeout也能實(shí)現(xiàn),下面通過(guò)一個(gè)小例子實(shí)現(xiàn)使用setTimeout實(shí)現(xiàn)setInterval的定時(shí)調(diào)度功能:
function logic() { console.log(Date.now()); setTimeout(logic, 1000); } logic();demo3:setInterval宏任務(wù)和微任務(wù)深入
demo1:setTimeout與setInterval demo
運(yùn)行結(jié)果:
? 從運(yùn)行結(jié)果可以發(fā)現(xiàn),JavaScript的代碼在瀏覽器中的執(zhí)行順序是【同步任務(wù)】 => 【清空微任務(wù)隊(duì)列】=>【宏任務(wù)】=> 【清空微任務(wù)隊(duì)列】,如果在執(zhí)行微任務(wù)時(shí),又發(fā)現(xiàn)了微任務(wù),它會(huì)把這個(gè)微任務(wù)放入到微任務(wù)隊(duì)列的末尾。宏任務(wù)也一樣,如果在執(zhí)行宏任務(wù)的時(shí)候發(fā)現(xiàn)了宏任務(wù),它也會(huì)把這個(gè)宏任務(wù)放入宏任務(wù)隊(duì)列的末尾。
? 上代碼詳細(xì)的運(yùn)行步驟隊(duì)列圖,我已經(jīng)寫(xiě)成了PPT,大家可以下載打開(kāi)看效果,可以詳細(xì)了解每一段代碼在隊(duì)列中的樣子:
https://github.com/Jameswain/...
參考文檔:
Tasks, microtasks, queues 和 schedules
Tasks, microtasks, queues and schedules
瀏覽器和Node不同的事件循環(huán)(Event Loop)
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/104063.html
摘要:本篇文章主要是對(duì)中的異步更新策略和機(jī)制的解析,需要讀者有一定的使用經(jīng)驗(yàn)并且熟悉掌握事件循環(huán)模型。這個(gè)結(jié)果足以說(shuō)明中的更新并非同步。二是把回調(diào)函數(shù)放入一個(gè)隊(duì)列,等待適當(dāng)?shù)臅r(shí)機(jī)執(zhí)行。通過(guò)的主動(dòng)來(lái)觸發(fā)的事件,進(jìn)而把回調(diào)函數(shù)作為參與事件循環(huán)。 本篇文章主要是對(duì)Vue中的DOM異步更新策略和nextTick機(jī)制的解析,需要讀者有一定的Vue使用經(jīng)驗(yàn)并且熟悉掌握J(rèn)avaScript事件循環(huán)模型。 ...
摘要:就是每次傳入的函數(shù)最后是的任務(wù)之后,開(kāi)始執(zhí)行,可以看到此時(shí)會(huì)批量執(zhí)行中的函數(shù),而且還給這些中回調(diào)函數(shù)放入了一個(gè)這個(gè)很顯眼的函數(shù)之中,表示這些回調(diào)函數(shù)是在微任務(wù)中執(zhí)行的。下一模塊會(huì)對(duì)此微任務(wù)中的插隊(duì)行為進(jìn)行詳解。 有關(guān)Eventloop+Promise的面試題大約分以下幾個(gè)版本——得心應(yīng)手版、游刃有余版、爐火純青版、登峰造極版和究極變態(tài)版。假設(shè)小伙伴們戰(zhàn)到最后一題,以后遇到此類(lèi)問(wèn)題,都是...
摘要:事件循環(huán)事件循環(huán)是實(shí)現(xiàn)異步的一種方法,也是的執(zhí)行機(jī)制。最后的最后是一門(mén)單線程語(yǔ)言是的執(zhí)行機(jī)制部分內(nèi)容轉(zhuǎn)自 1.單線程 javascript是一門(mén)單線程語(yǔ)言 2.javascript事件循環(huán) 同步任務(wù) 異步任務(wù) showImg(https://segmentfault.com/img/bVbufUd?w=1268&h=1062);除了廣義的同步任務(wù)和異步任務(wù),我們對(duì)任務(wù)有更精細(xì)的定義...
前言 我在學(xué)習(xí)瀏覽器和NodeJS的Event Loop時(shí)看了大量的文章,那些文章都寫(xiě)的很好,但是往往是每篇文章有那么幾個(gè)關(guān)鍵的點(diǎn),很多篇文章湊在一起綜合來(lái)看,才可以對(duì)這些概念有較為深入的理解。 于是,我在看了大量文章之后,想要寫(xiě)這么一篇博客,不采用官方的描述,結(jié)合自己的理解以及示例代碼,用最通俗的語(yǔ)言表達(dá)出來(lái)。希望大家可以通過(guò)這篇文章,了解到Event Loop到底是一種什么機(jī)制,瀏覽器和Nod...
閱讀 1059·2021-11-22 15:33
閱讀 3373·2021-11-08 13:20
閱讀 1388·2021-09-22 10:55
閱讀 2058·2019-08-29 11:08
閱讀 780·2019-08-26 12:24
閱讀 3077·2019-08-23 17:15
閱讀 2239·2019-08-23 16:12
閱讀 1944·2019-08-23 16:09