亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > JS > 正文

詳解JS瀏覽器事件循環機制

2024-05-06 16:49:29
字體:
來源:轉載
供稿:網友

先來明白些概念性內容。

進程、線程

進程是系統分配的獨立資源,是 CPU 資源分配的基本單位,進程是由一個或者多個線程組成的。

線程是進程的執行流,是CPU調度和分派的基本單位,同個進程之中的多個線程之間是共享該進程的資源的。

瀏覽器內核

瀏覽器是多進程的,瀏覽器每一個 tab 標簽都代表一個獨立的進程(也不一定,因為多個空白 tab 標簽會合并成一個進程),瀏覽器內核(瀏覽器渲染進程)屬于瀏覽器多進程中的一種。

瀏覽器內核有多種線程在工作。

GUI 渲染線程:

  1. 負責渲染頁面,解析 HTML,CSS 構成 DOM 樹等,當頁面重繪或者由于某種操作引起回流都會調起該線程。
  2. 和 JS 引擎線程是互斥的,當 JS 引擎線程在工作的時候,GUI 渲染線程會被掛起,GUI 更新被放入在 JS 任務隊列中,等待 JS 引擎線程空閑的時候繼續執行。

JS 引擎線程:

  1. 單線程工作,負責解析運行 JavaScript 腳本。
  2. 和 GUI 渲染線程互斥,JS 運行耗時過長就會導致頁面阻塞。

事件觸發線程:

當事件符合觸發條件被觸發時,該線程會把對應的事件回調函數添加到任務隊列的隊尾,等待 JS 引擎處理。

定時器觸發線程:

  1. 瀏覽器定時計數器并不是由 JS 引擎計數的,阻塞會導致計時不準確。
  2. 開啟定時器觸發線程來計時并觸發計時,計時完成后會被添加到任務隊列中,等待 JS 引擎處理。

http 請求線程:

  1. http 請求的時候會開啟一條請求線程。
  2. 請求完成有結果了之后,將請求的回調函數添加到任務隊列中,等待 JS 引擎處理。

 JS,瀏覽器事件,循環機制

JavaScript 引擎是單線程

JavaScript 引擎是單線程,也就是說每次只能執行一項任務,其他任務都得按照順序排隊等待被執行,只有當前的任務執行完成之后才會往下執行下一個任務。

HTML5 中提出了 Web-Worker API,主要是為了解決頁面阻塞問題,但是并沒有改變 JavaScript 是單線程的本質。了解 Web-Worker。

JavaScript 事件循環機制

JavaScript 事件循環機制分為瀏覽器和 Node 事件循環機制,兩者的實現技術不一樣,瀏覽器 Event Loop 是 HTML 中定義的規范,Node Event Loop 是由 libuv 庫實現。這里主要講的是瀏覽器部分。

Javascript 有一個 main thread 主線程和 call-stack 調用棧(執行棧),所有的任務都會被放到調用棧等待主線程執行。

JS 調用棧

JS 調用棧是一種后進先出的數據結構。當函數被調用時,會被添加到棧中的頂部,執行完成之后就從棧頂部移出該函數,直到棧內被清空。

同步任務、異步任務

JavaScript 單線程中的任務分為同步任務和異步任務。同步任務會在調用棧中按照順序排隊等待主線程執行,異步任務則會在異步有了結果后將注冊的回調函數添加到任務隊列(消息隊列)中等待主線程空閑的時候,也就是棧內被清空的時候,被讀取到棧中等待主線程執行。任務隊列是先進先出的數據結構。

Event Loop

調用棧中的同步任務都執行完畢,棧內被清空了,就代表主線程空閑了,這個時候就會去任務隊列中按照順序讀取一個任務放入到棧中執行。每次棧內被清空,都會去讀取任務隊列有沒有任務,有就讀取執行,一直循環讀取-執行的操作,就形成了事件循環。

JS,瀏覽器事件,循環機制

JS,瀏覽器事件,循環機制

定時器

定時器會開啟一條定時器觸發線程來觸發計時,定時器會在等待了指定的時間后將事件放入到任務隊列中等待讀取到主線程執行。

定時器指定的延時毫秒數其實并不準確,因為定時器只是在到了指定的時間時將事件放入到任務隊列中,必須要等到同步的任務和現有的任務隊列中的事件全部執行完成之后,才會去讀取定時器的事件到主線程執行,中間可能會存在耗時比較久的任務,那么就不可能保證在指定的時間執行。

宏任務(macro-task)、微任務(micro-task)

除了廣義的同步任務和異步任務,JavaScript 單線程中的任務可以細分為宏任務和微任務。

macro-task包括:script(整體代碼), setTimeout, setInterval, setImmediate, I/O, UI rendering。

micro-task包括:process.nextTick, Promises, Object.observe, MutationObserver。

console.log(1);setTimeout(function() {  console.log(2);})var promise = new Promise(function(resolve, reject) {  console.log(3);  resolve();})promise.then(function() {  console.log(4);})console.log(5);

示例中,setTimeout 和 Promise被稱為任務源,來自不同的任務源注冊的回調函數會被放入到不同的任務隊列中。

有了宏任務和微任務的概念后,那 JS 的執行順序是怎樣的?是宏任務先還是微任務先?

第一次事件循環中,JavaScript 引擎會把整個 script 代碼當成一個宏任務執行,執行完成之后,再檢測本次循環中是否尋在微任務,存在的話就依次從微任務的任務隊列中讀取執行完所有的微任務,再讀取宏任務的任務隊列中的任務執行,再執行所有的微任務,如此循環。JS 的執行順序就是每次事件循環中的宏任務-微任務。

  1. 上面的示例中,第一次事件循環,整段代碼作為宏任務進入主線程執行。
  2. 遇到了 setTimeout ,就會等到過了指定的時間后將回調函數放入到宏任務的任務隊列中。
  3. 遇到 Promise,將 then 函數放入到微任務的任務隊列中。
  4. 整個事件循環完成之后,會去檢測微任務的任務隊列中是否存在任務,存在就執行。
  5. 第一次的循環結果打印為: 1,3,5,4。
  6. 接著再到宏任務的任務隊列中按順序取出一個宏任務到棧中讓主線程執行,那么在這次循環中的宏任務就是 setTimeout 注冊的回調函數,執行完這個回調函數,發現在這次循環中并不存在微任務,就準備進行下一次事件循環。
  7. 檢測到宏任務隊列中已經沒有了要執行的任務,那么就結束事件循環。
  8. 最終的結果就是 1,3,5,4,2。

以上所述是小編給大家介紹的JS瀏覽器事件循環機制詳解整合,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對VeVb武林網網站的支持!


注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲精品影视在线观看| 中文字幕精品久久| 一区二区三区久久精品| 亚洲国产精品成人av| 亚洲一区999| 亚洲美女动态图120秒| 日韩在线观看免费高清| 亚洲欧洲国产一区| 欧美视频一二三| 日韩成人在线免费观看| 欧美亚洲激情在线| 成人免费在线视频网站| 成人免费观看网址| 中文字幕在线精品| 亚洲高清久久久久久| 尤物九九久久国产精品的特点| 亚洲国产精品视频在线观看| 国内精品久久久久影院优| 清纯唯美亚洲激情| 亚洲无限乱码一二三四麻| 国产精品高清免费在线观看| 久久久亚洲国产| 久久久久久久久久久人体| 国产欧美日韩视频| 日韩在线欧美在线国产在线| 亚洲欧美综合图区| 亚洲国产中文字幕在线观看| 国产精品免费一区豆花| 亚洲自拍av在线| 日本91av在线播放| 欧美黑人巨大精品一区二区| 国产精品人成电影在线观看| 55夜色66夜色国产精品视频| 狠狠躁夜夜躁人人躁婷婷91| 51精品在线观看| 国产精品电影一区| 国产精品久久久久久av福利| 日韩美女视频在线观看| 久久99久国产精品黄毛片入口| 日韩av在线免费| 亚洲最新在线视频| 欧美国产日韩二区| 欧美一级电影在线| 亚洲三级 欧美三级| 久久天天躁狠狠躁夜夜躁| 国产成人精品av在线| 欧美高清视频在线播放| 久久久精品欧美| 欧美精品videosex极品1| 91av成人在线| 狠狠躁天天躁日日躁欧美| 国产欧美一区二区三区在线| 海角国产乱辈乱精品视频| 深夜福利日韩在线看| 91网站在线免费观看| 久久99亚洲精品| 久久成年人免费电影| 国产精品永久在线| 欧美日韩精品在线观看| 91成人天堂久久成人| 国产精品999999| 97超碰色婷婷| 国产精品27p| 欧美日韩中文字幕在线视频| 国产这里只有精品| 91国偷自产一区二区三区的观看方式| 久久青草福利网站| 91在线视频免费| 中文字幕亚洲综合| 国产精品香蕉在线观看| 欧美性色19p| 亚洲综合国产精品| 91精品国产91久久久久久不卡| 国产成人精品日本亚洲| 国产+人+亚洲| 在线成人一区二区| 日韩在线观看免费全| 国语自产偷拍精品视频偷| 久久久久久久国产| 日韩美女在线播放| 亚洲精品中文字幕女同| 成人国产亚洲精品a区天堂华泰| 97久久精品国产| 欧美成在线观看| 国产精品久久999| 久久综合久久美利坚合众国| 久久精品男人天堂| 欧美一级片久久久久久久| 国产精品普通话| 欧美人交a欧美精品| 狠狠色狠狠色综合日日小说| 亚洲最大av在线| 欧美成人免费全部观看天天性色| 欧美激情视频免费观看| 欧美专区第一页| 亚洲人成电影网站色www| 亚洲色图18p| 91亚洲午夜在线| 精品福利在线看| 亚洲国产天堂网精品网站| 国模叶桐国产精品一区| 国产视频精品va久久久久久| 国产精品女主播视频| 亚洲片国产一区一级在线观看| 羞羞色国产精品| 日韩一级黄色av| 亚洲专区中文字幕| 亚洲社区在线观看| 黄色精品一区二区| 亚洲精品国产精品乱码不99按摩| 精品成人69xx.xyz| 久久99亚洲热视| 97精品一区二区视频在线观看| 97精品视频在线播放| 欧美亚洲成人免费| 久久人人爽人人爽人人片av高清| 日韩毛片中文字幕| 91久久久亚洲精品| 国产精品一区二区性色av| 97人人模人人爽人人喊中文字| 性欧美xxxx交| 成人精品一区二区三区电影黑人| 久久精品国产欧美亚洲人人爽| 国产精品香蕉国产| 一本色道久久88精品综合| 97香蕉超级碰碰久久免费的优势| 欧美性猛交xxx| 日韩精品免费看| 成人黄色短视频在线观看| 国产成人精品一区| 精品一区二区三区电影| 久久香蕉国产线看观看av| 国产精品视频一区国模私拍| 国产91在线视频| 亚洲精品v欧美精品v日韩精品| 中文字幕日韩综合av| 欧美电影《睫毛膏》| 国产精品尤物福利片在线观看| 久久久久久国产精品久久| 亚洲最大福利视频网| 国产日韩欧美在线播放| 欧美成人高清视频| 日韩av中文字幕在线播放| 大胆人体色综合| 97超视频免费观看| 国产成人鲁鲁免费视频a| 黄色一区二区在线| 亚洲精品短视频| 亚洲激情视频网站| 国产激情999| 中文字幕精品视频| 欧美多人爱爱视频网站| 欧美自拍视频在线| 亚洲深夜福利在线| 亚洲成色777777在线观看影院| 亚洲最大福利视频网| 亚洲男子天堂网| 国产精品爽黄69天堂a| 久久精品国产亚洲| 日韩欧美中文字幕在线观看| 久久久之久亚州精品露出| 国产精品一二三在线| 成人午夜两性视频| 精品亚洲一区二区三区在线播放|