成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

js事件循環(huán)

elarity / 2450人閱讀

摘要:每一個程序都擁有唯一的事件循環(huán),大多數(shù)代碼的執(zhí)行順序是可以根據(jù)函數(shù)調(diào)用棧的規(guī)則執(zhí)行的,而或者不同的事件綁定等中的代碼,則通過隊(duì)列來執(zhí)行。當(dāng)所有可執(zhí)行的執(zhí)行完畢之后,就表示第一次事件循環(huán)結(jié)束第二次循環(huán)會再次從開始執(zhí)行。

console.log("begin");
setTimeout(function() { console.log("timeout") });
new Promise(function(resolve) {
    for (let i = 0; i < 3; i++) {
        if (i == 1) resolve();
        console.log(i);
    }
    console.log("promise")
}).then(function() {
    console.log("then")
})
console.log("end");

上述代碼依次輸出:begin、0、1、2、promise、end、then、timeout

js的一個特點(diǎn)就是單線程,但是很多時候我們?nèi)匀恍枰诓煌臅r間去執(zhí)行不同的任務(wù),例如給元素添加點(diǎn)擊事件,設(shè)置一個定時器,或者發(fā)起ajax請求,因此需要一個異步機(jī)制來達(dá)到這樣的目的,事件循環(huán)機(jī)制也因此而來。

每一個js程序都擁有唯一的事件循環(huán),大多數(shù)代碼的執(zhí)行順序是可以根據(jù)函數(shù)調(diào)用棧的規(guī)則執(zhí)行的,而setTimeout/setInterval或者不同的事件綁定(click、mousedown等)中的代碼,則通過隊(duì)列來執(zhí)行。

任務(wù)隊(duì)列又分為宏任務(wù)(macro-task)與微任務(wù)(micro-task)兩種,在瀏覽器中,包括:

macro-task:script(整體代碼)、setTimeout/setInterval、I/O、UI rendering等

micro-task:Promise、MutationObserver

事件循環(huán)的順序,決定了js代碼的執(zhí)行順序:
首先從macro-task中的script開始第一次循環(huán)。此時全局上下文進(jìn)入函數(shù)調(diào)用棧,直到調(diào)用棧清空,在這個過程中,如果遇到任務(wù)分發(fā)器(例如timer、promise),就會將任務(wù)放入對應(yīng)隊(duì)列中去

第一次循環(huán)時,macro-task中其實(shí)只有script,因此函數(shù)調(diào)用棧清空之后,會直接執(zhí)行所有的micro-task。當(dāng)所有可執(zhí)行的micro-task執(zhí)行完畢之后,就表示第一次事件循環(huán)結(jié)束

第二次循環(huán)會再次從macro-task開始執(zhí)行。此時macro-task中的script隊(duì)列已經(jīng)沒有任務(wù)了,但是可能會有其他的隊(duì)列任務(wù),而micro-task中暫時還沒有任務(wù)。此時會先選擇其中一個宏任務(wù)隊(duì)列,例如setTimeout,將該隊(duì)列中所有的任務(wù)全部執(zhí)行完畢,然后再執(zhí)行此過程中可能產(chǎn)生的微任務(wù)。微任務(wù)執(zhí)行完畢之后,再回過頭來執(zhí)行其他宏任務(wù)隊(duì)列中的任務(wù)。以此類推,直到所有宏任務(wù)隊(duì)列中的任務(wù)都被執(zhí)行了,并且清空了微任務(wù),第二次循環(huán)就會結(jié)束

如果在第二次循環(huán)過程中,產(chǎn)生了新的宏任務(wù)隊(duì)列,或者之前宏任務(wù)隊(duì)列中的任務(wù)暫時沒有滿足執(zhí)行條件,例如延遲時間不夠或者事件沒有被觸發(fā),那么將會繼續(xù)以同樣的順序重復(fù)循環(huán)

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/105627.html

相關(guān)文章

  • [譯]事件循環(huán),Node.js背后的核心概念

    摘要:事件處理器,則是當(dāng)指定事件觸發(fā)時,執(zhí)行的一段代碼。事件循環(huán)以一個無限循環(huán)的形式啟動,存在于二進(jìn)制文件里函數(shù)的最后,當(dāng)沒有更多可被執(zhí)行的事件處理器時,它就退出。 前言 如果你了解過Node.js,那么你一定聽說過事件循環(huán)。你一定想知道它為什么那么特殊,并且為什么你需要關(guān)注它?此時此刻的你,可能已經(jīng)寫過許多基于Express.js的后端代碼,但沒有接觸到任何的循環(huán)。 在下文中,我們會先在一...

    Meils 評論0 收藏0
  • Node.js 指南(Node.js事件循環(huán)、定時器和process.nextTick())

    摘要:檢索新的事件執(zhí)行與相關(guān)的回調(diào)幾乎所有,除了由定時器調(diào)度的一些和將在適當(dāng)?shù)臅r候在這里阻塞。在事件循環(huán)的每次運(yùn)行之間,檢查它是否在等待任何異步或定時器,如果沒有,則徹底關(guān)閉。 Node.js事件循環(huán)、定時器和process.nextTick() 什么是事件循環(huán)? 事件循環(huán)允許Node.js執(zhí)行非阻塞I/O操作 — 盡管JavaScript是單線程的 — 通過盡可能將操作卸載到系統(tǒng)內(nèi)核。 ...

    pingink 評論0 收藏0
  • JavaScript事件循環(huán)(Event Loop)

    摘要:事件循環(huán)的順序,決定代碼執(zhí)行的順序。輸出第二輪事件循環(huán)正式結(jié)束三第三輪事件循環(huán)第三輪事件循環(huán)從宏任務(wù)開始。記為遇到,立即執(zhí)行回調(diào)函數(shù)放入中注冊,然后被分發(fā)到微任務(wù)事件隊(duì)列中。 1、為什么要有事件循環(huán)? 因?yàn)閖s是單線程的,事件循環(huán)是js的執(zhí)行機(jī)制,也是js實(shí)現(xiàn)異步的一種方法。 既然js是單線程,那就像只有一個窗口的銀行,客戶需要排隊(duì)一個一個辦理業(yè)務(wù),同理js任務(wù)也要一個一個順序執(zhí)行。如...

    dmlllll 評論0 收藏0
  • 【筆記】 你不知道的JS讀書筆記——異步

    摘要:異步請求線程在在連接后是通過瀏覽器新開一個線程請求將檢測到狀態(tài)變更時,如果設(shè)置有回調(diào)函數(shù),異步線程就產(chǎn)生狀態(tài)變更事件,將這個回調(diào)再放入事件循環(huán)隊(duì)列中。 基礎(chǔ):瀏覽器 -- 多進(jìn)程,每個tab頁獨(dú)立一個瀏覽器渲染進(jìn)程(瀏覽器內(nèi)核) 每個瀏覽器渲染進(jìn)程是多線程的,主要包括:GUI渲染線程 JS引擎線程 也稱為JS內(nèi)核,負(fù)責(zé)處理Javascript腳本程序。(例如V8引擎) JS引擎線程負(fù)...

    junnplus 評論0 收藏0
  • Javascript事件循環(huán)機(jī)制以及渲染引擎何時渲染UI

    摘要:的一大特點(diǎn)就是單線程,而這個線程中擁有唯一的一個事件循環(huán)。事件循環(huán)基本概念代碼的執(zhí)行過程中,除了依靠函數(shù)調(diào)用棧來搞定函數(shù)的執(zhí)行順序外,還依靠任務(wù)隊(duì)列來搞定另外一些代碼的執(zhí)行。之后全局上下文進(jìn)入函數(shù)調(diào)用棧。 JavaScript的一大特點(diǎn)就是單線程,而這個線程中擁有唯一的一個事件循環(huán)。 事件循環(huán)基本概念 JavaScript代碼的執(zhí)行過程中,除了依靠函數(shù)調(diào)用棧來搞定函數(shù)的執(zhí)行順序外,還...

    cnio 評論0 收藏0
  • 真正理解 Node.js事件循環(huán)

    摘要:輪詢投票處理下一次處理的新事件立即設(shè)置運(yùn)行通過注冊的所有回調(diào)關(guān)閉執(zhí)行所有的回調(diào)工作處理延遲此度量標(biāo)準(zhǔn)測量線程池處理異步任務(wù)需要多長時間。高工作時間處理延遲表明繁忙耗盡的線程池。 原文=> What you should know to really understand the Node.js Event Loop Node.js 是一個基于事件的平臺。這就意味著在Node中發(fā)生的所...

    GeekGhc 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<