這篇文章主要介紹了關於JS瀏覽器事件循環機制,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下
先來明白些概念性內容。
進程、執行緒
進程是系統分配的獨立資源,是 CPU 資源分配的基本單位,進程是由一個或多個執行緒組成的。
執行緒是進程的執行流,是CPU調度和分派的基本單位,同個進程之中的多個執行緒之間是共享該進程的資源的。
瀏覽器核心
瀏覽器是多進程的,瀏覽器每個tab 標籤都代表一個獨立的進程(也不一定,因為多個空白tab 標籤會合併成一個行程),瀏覽器核心(瀏覽器渲染進程)屬於瀏覽器多進程中的一個。
瀏覽器核心有多種執行緒在工作。
http 請求的時候會開啟一條請求執行緒。
請求完成有結果了之後,將請求的回呼函數加入到任務佇列中,等待 JS 引擎處理。
瀏覽器定時計數器並不是 JS 引擎計數的,阻塞會導致計時不準確。
開啟計時器觸發執行緒來計時並觸發計時,計時完成後會被加入到任務佇列中,等待 JS 引擎處理。
當事件符合觸發條件被觸發時,該執行緒會把對應的事件回呼函數加到任務佇列的隊尾,等待 JS 引擎處理。
單執行緒工作,負責解析執行 JavaScript 腳本。
和 GUI 渲染執行緒互斥,JS 運行耗時過長就會導致頁面阻塞。
負責渲染頁面,解析 HTML,CSS 構成 DOM 樹等,當頁面重繪或由於某種操作引起回流都會調起該線程。
和JS 引擎執行緒是互斥的,當JS 引擎執行緒在工作的時候,GUI 渲染執行緒會被掛起,GUI 更新被放入在JS 任務佇列中,等待JS 引擎線程空閒的時候會繼續執行。
GUI 渲染執行緒:
JS 引擎執行緒:
事件觸發執行緒:
定時器觸發執行緒:
http 請求執行緒:
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
呼叫堆疊中的同步任務都執行完畢,堆疊內被清空了,就代表主執行緒空閒了,這時候就會去任務佇列中依照順序讀取一個任務放入到棧中執行。每次棧內清空,都會去讀取任務佇列有沒有任務,有就讀取執行,一直循環讀取-執行的操作,就形成了事件循環。
-
#定時器
計時器會開啟一個定時器觸發執行緒來觸發計時,計時器會在等待了指定的時間後將事件放入到任務佇列中等待讀取到主執行緒執行。
定時器指定的延時毫秒數其實並不準確,因為定時器只是在到了指定的時間時將事件放入到任務佇列中,必須要等到同步的任務和現有的任務佇列中的事件全部執行完成之後,才會去讀取定時器的事件到主執行緒執行,中間可能會有耗時比較久的任務,那麼就不可能保證在指定的時間執行。
-
宏任務(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 的執行順序就是每次事件循環中的巨集任務-微任務。
在上面的範例中,第一次事件循環,整段程式碼作為巨集任務進入主執行緒執行。
遇到了 setTimeout ,就會等到了指定的時間後將回呼函數放入到巨集任務的任務佇列中。
遇到 Promise,將 then 函數放入到微任務的任務佇列中。
整個事件循環完成之後,會去偵測微任務的任務佇列中是否存在任務,存在就執行。
第一次的循環結果列印為: 1,3,5,4。
接著到巨集任務的任務佇列中按順序取出一個巨集任務到堆疊中讓主執行緒執行,那麼在這次迴圈中的巨集任務就是setTimeout 註冊的回呼函數,執行完這個回呼函數,發現在這次循環中並不存在微任務,就準備下一次事件循環。
偵測到巨集任務佇列中已經沒有了要執行的任務,那麼就結束事件循環。
最終的結果就是 1,3,5,4,2。
以上就是本文的全部內容,希望對大家的學習有所幫助,更多相關內容請關注PHP中文網!
相關建議:
以上是JS瀏覽器事件循環機制的詳細內容。更多資訊請關注PHP中文網其他相關文章!

Python和JavaScript的主要區別在於類型系統和應用場景。 1.Python使用動態類型,適合科學計算和數據分析。 2.JavaScript採用弱類型,廣泛用於前端和全棧開發。兩者在異步編程和性能優化上各有優勢,選擇時應根據項目需求決定。

選擇Python還是JavaScript取決於項目類型:1)數據科學和自動化任務選擇Python;2)前端和全棧開發選擇JavaScript。 Python因其在數據處理和自動化方面的強大庫而備受青睞,而JavaScript則因其在網頁交互和全棧開發中的優勢而不可或缺。

Python和JavaScript各有優勢,選擇取決於項目需求和個人偏好。 1.Python易學,語法簡潔,適用於數據科學和後端開發,但執行速度較慢。 2.JavaScript在前端開發中無處不在,異步編程能力強,Node.js使其適用於全棧開發,但語法可能複雜且易出錯。

javascriptisnotbuiltoncorc; sanInterpretedlanguagethatrunsonenginesoftenwritteninc.1)JavascriptwasdesignedAsignedAsalightWeight,drackendedlanguageforwebbrowsers.2)Enginesevolvedfromsimpleterterpretpretpretpretpreterterpretpretpretpretpretpretpretpretpretcompilerers,典型地,替代品。

JavaScript可用於前端和後端開發。前端通過DOM操作增強用戶體驗,後端通過Node.js處理服務器任務。 1.前端示例:改變網頁文本內容。 2.後端示例:創建Node.js服務器。

選擇Python還是JavaScript應基於職業發展、學習曲線和生態系統:1)職業發展:Python適合數據科學和後端開發,JavaScript適合前端和全棧開發。 2)學習曲線:Python語法簡潔,適合初學者;JavaScript語法靈活。 3)生態系統:Python有豐富的科學計算庫,JavaScript有強大的前端框架。

JavaScript框架的強大之處在於簡化開發、提升用戶體驗和應用性能。選擇框架時應考慮:1.項目規模和復雜度,2.團隊經驗,3.生態系統和社區支持。

引言我知道你可能會覺得奇怪,JavaScript、C 和瀏覽器之間到底有什麼關係?它們之間看似毫無關聯,但實際上,它們在現代網絡開發中扮演著非常重要的角色。今天我們就來深入探討一下這三者之間的緊密聯繫。通過這篇文章,你將了解到JavaScript如何在瀏覽器中運行,C 在瀏覽器引擎中的作用,以及它們如何共同推動網頁的渲染和交互。 JavaScript與瀏覽器的關係我們都知道,JavaScript是前端開發的核心語言,它直接在瀏覽器中運行,讓網頁變得生動有趣。你是否曾經想過,為什麼JavaScr


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

MantisBT
Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

記事本++7.3.1
好用且免費的程式碼編輯器

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。