国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

JavaScript事件循環(huán)探索

hqman / 2656人閱讀

摘要:事件循環(huán)事件循環(huán)具有至少兩個隊列處理任務(wù)。同時含有宏任務(wù)和微任務(wù)主線程運(yùn)行運(yùn)行運(yùn)行運(yùn)行本例中在的事件處理函數(shù)里增加了一個立即兌現(xiàn)的,需要運(yùn)行。處理的事件處理函數(shù)計時器主線程運(yùn)行運(yùn)行運(yùn)行運(yùn)行

一直對js的事件循環(huán)不是很清晰,最近看了JavaScript忍者秘籍的第13章后,有了一些感悟,特此總結(jié)一下,分享給大家。

單線程

眾所周知,JavaScript是單線程執(zhí)行模型,同一時刻只能執(zhí)行一個代碼片段,一個任務(wù)開始后知道運(yùn)行完成,不會被其他任務(wù)中斷。當(dāng)一個任務(wù)花費(fèi)的時間很長的話,用戶就會明顯的感覺到卡頓。瀏覽器為了解決這個問題引入了事件循環(huán)的概念(Event Loop)。

事件循環(huán)

事件循環(huán)具有至少兩個隊列處理任務(wù)。任務(wù)分為兩類,宏任務(wù)(macro-task)和微任務(wù)(micro-task)。

1.宏任務(wù)代表一個個離散、獨(dú)立的工作單元,運(yùn)行完之后,瀏覽器可以繼續(xù)其他的調(diào)度。包括:創(chuàng)建文檔對象,解析HTML,執(zhí)行JavaScript,以及各種事件……
2.微任務(wù)是更小的任務(wù),主要用戶更新應(yīng)用程序的狀態(tài),必須在瀏覽器任務(wù)繼續(xù)執(zhí)行其他任務(wù)之前執(zhí)行。微任務(wù)需要盡可能快地通過異步方式執(zhí)行,同時不能產(chǎn)生全新的微任務(wù)。包括promise、回調(diào)函數(shù)、DOM發(fā)生變化……
僅包含宏任務(wù)
// 主線程JavaScript運(yùn)行15ms
btn1.addEventListener("click", function() {運(yùn)行 8ms}, false);
btn2.addEventListener("click", function() {運(yùn)行 5ms}, false);

現(xiàn)在假設(shè)主線程運(yùn)行15ms, 在第5ms單擊btn1,在第12ms的時候單擊btn2。基于單線程執(zhí)行模型,單擊按鈕之后不會立即執(zhí)行對應(yīng)的處理函數(shù),因?yàn)橐粋€任務(wù)一旦開始就不會被另一個任務(wù)中斷。因此,在主線程執(zhí)行的15ms期間,按鈕的單擊處理函數(shù)放入隊列。當(dāng)主線程執(zhí)行完成也就是15ms之后,程序開始處理微任務(wù),因?yàn)楫?dāng)前不存在微任務(wù),跳過此步驟,開始執(zhí)行更新UI。

之后進(jìn)入第二次循環(huán),也就是開始執(zhí)行btn1的處理函數(shù),需要運(yùn)行8ms,btn2處理函數(shù)在隊列中等待。當(dāng)btn1處理函數(shù)執(zhí)行完之后,瀏覽器檢查微任務(wù)是否存在和是否更新UI,刪除任務(wù)隊列里的btn1的處理函數(shù)。

最后進(jìn)入第三次循環(huán),開始執(zhí)行btn2的處理函數(shù),需要運(yùn)行5ms,處理函數(shù)執(zhí)行完之后,檢查微任務(wù)和是否需要更新UI,刪除任務(wù)隊列里的btn2的處理函數(shù),最終任務(wù)隊列為空,循環(huán)結(jié)束。

同時含有宏任務(wù)和微任務(wù)
// 主線程JavaScript運(yùn)行15ms
btn1.addEventListener("click", function() {
    Promise.resolve().then(() => {
       運(yùn)行 4ms 
    });
    運(yùn)行 8ms 
}, false);
btn2.addEventListener("click", function() {運(yùn)行 5ms}, false);

本例中在btn1的事件處理函數(shù)里增加了一個立即兌現(xiàn)的Promise,需要運(yùn)行4ms。

現(xiàn)在代碼的執(zhí)行順序?yàn)椋?/p>

主線程執(zhí)行15ms,在5ms和12ms的時候分別將處理函數(shù)放入任務(wù)隊列,更新UI。

15m后處理btn1事件處理函數(shù),發(fā)現(xiàn)Promise,放入微任務(wù)隊列,btn1事件處理函數(shù)繼續(xù)執(zhí)行8ms,檢查微任務(wù)隊列發(fā)現(xiàn)有Promise回調(diào)函數(shù),然后開始執(zhí)行Promise回調(diào)函數(shù),運(yùn)行4ms,繼續(xù)檢查微任務(wù)隊列,如果為空,檢查是否需要更新UI,進(jìn)入下一輪循環(huán)。

處理btn2的事件處理函數(shù)……

計時器
// 主線程JavaScript運(yùn)行18ms
setTimeout(function() {
    運(yùn)行6ms;
}, 10);
setInterval(function() {
    運(yùn)行8ms;
}, 10);
btn1.addEventListener("click", function() {運(yùn)行 10ms}, false);

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

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/96237.html

相關(guān)文章

  • 簡潔明了探索瀏覽器Event loop

    摘要:前段時間我對于瀏覽器中的和哪個先執(zhí)行有所困惑,苦于搜索也沒有發(fā)現(xiàn)很明確的答案,于是決定深入探索瀏覽器,現(xiàn)有所愚見,想與大家分享,希望能幫助到那些還在爬坑的人。瀏覽器端中的異步隊列有兩種隊列和隊列。瀏覽器會不斷從隊列中按順序取執(zhí)行。 前段時間我對于瀏覽器Event loop中的MacroTask和MicroTask哪個先執(zhí)行有所困惑,苦于搜索也沒有發(fā)現(xiàn)很明確的答案,于是決定深入探索瀏覽器...

    DrizzleX 評論0 收藏0
  • JavaScript是如何工作的:Web Workers的構(gòu)建塊+ 5個使用他們的場景

    摘要:最后,提供個正確使用的場景。異步編程的一個很好的用例就請求。這意味著異步函數(shù)只能解決一小部分語言單線程中的局限性問題。中有類似的集群子進(jìn)程概念,他們也是多線程但是和還是有區(qū)別。可用的特性由于的多線程特性,工作者只能訪問特性的一個子集。 showImg(https://segmentfault.com/img/bVblS8J?w=400&h=298); 這是專門探索 JavaScript...

    ningwang 評論0 收藏0
  • JavaScript是如何工作: 深入探索 websocket 和HTTP/2與SSE +如何選擇正

    摘要:數(shù)據(jù)作為消息通過傳輸,每個消息由一個或多個幀組成,其中包含正在發(fā)送的數(shù)據(jù)有效負(fù)載。幀數(shù)據(jù)如上所述,數(shù)據(jù)可以被分割成多個幀。但是,規(guī)范希望能夠處理交錯的控制幀。 文章底部分享給大家一套 react + socket 實(shí)戰(zhàn)教程 這是專門探索 JavaScript 及其所構(gòu)建的組件的系列文章的第5篇。 想閱讀更多優(yōu)質(zhì)文章請猛戳GitHub博客,一年百來篇優(yōu)質(zhì)文章等著你! 如果你錯過了前面的章...

    cuieney 評論0 收藏0
  • node核心特性理解

    摘要:概述本文主要介紹了我對的一些核心特性的理解,包括架構(gòu)特點(diǎn)機(jī)制核心模塊與簡單應(yīng)用。在此期間,主線程繼續(xù)執(zhí)行其他任務(wù)。延續(xù)了瀏覽器端單線程,只用一個主線程執(zhí)行,不斷循環(huán)遍歷事件隊列,執(zhí)行事件。 原文地址在我的博客,轉(zhuǎn)載請注明來源,謝謝! node是在前端領(lǐng)域經(jīng)常看到的詞。node對于前端的重要性已經(jīng)不言而喻,掌握node也是作為合格的前端工程師一項(xiàng)基本功了。知道node、知道后端的一些東西...

    huangjinnan 評論0 收藏0
  • 學(xué)習(xí)JavaScript之內(nèi)存泄漏

    摘要:接上回我寫了一篇關(guān)于閉包的博客學(xué)習(xí)之閉包,最后談到閉包導(dǎo)致的問題時留了一個尾在以下的瀏覽器中會有內(nèi)存泄漏的問題。今天的博客就繼續(xù)探索一下內(nèi)存泄漏的問題。博客地址的前端之路原文鏈接學(xué)習(xí)之內(nèi)存泄漏 接上回我寫了一篇關(guān)于閉包的博客《學(xué)習(xí)JavaScript之閉包》, 最后談到閉包導(dǎo)致的問題時留了一個尾: 在IE9以下的瀏覽器中會有內(nèi)存泄漏的問題。 今天的博客就繼續(xù)探索一下內(nèi)存泄漏的問題。 淺...

    nodejh 評論0 收藏0

發(fā)表評論

0條評論

hqman

|高級講師

TA的文章

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