js是單執行緒的,為什麼可以執行非同步操作呢?
這歸結與瀏覽器(js的宿主環境)透過某種方式使得js具備了非同步的屬性。
區分進程和執行緒:
進程:正在運行中的應用程式。每個進程都自己獨立的記憶體空間。例如:開啟的瀏覽器就是一個進程。
執行緒:進程的子集,是獨立的。線程在共享的記憶體空間中運行。
瀏覽器是多進程的。如下圖:
並且每開啟一個頁面就建立了一個獨立的進程。進程內有自己的多執行緒。如果瀏覽器是單進程的,那麼某個頁面崩了,就會影響整個瀏覽器。
瀏覽器有哪些程序:
1、Browser(瀏覽器):瀏覽器的主程序(負責協調,主控)只有一個,作用有:
• 負責瀏覽器介面顯示,與使用者互動。如前進,後退等
• 負責各個頁面的管理,創建和銷毀其他進程
• 將Renderer(渲染器)進程得到的內存中的Bitmap,繪製到用戶界面上
• 網路資源的管理,下載等
2、第三方外掛程式:每種類型的外掛程式對應一個流程,僅當使用該外掛程式時才建立
##3 、GPU進程:最多一個,用於3D繪製等4、瀏覽器渲染進程(瀏覽器核心)(Renderer(渲染器),內部是多執行緒的)預設每個Tab頁面一個行程,互不影響。主要作用:頁面渲染,腳本執行,事件處理等
瀏覽器渲染進程(瀏覽器核心)包含的執行緒:
1 、GUI渲染線程• 負責渲染瀏覽器介面,解析HTML,CSS,建構DOM樹和RenderObject樹,佈局和繪製等。 • 當介面需要重繪(Repaint)或由於某種操作引發回流(reflow)時,該線程就會執行• 注意,GUI渲染線程與JS引擎執行緒是互斥的,當JS引擎執行時GUI執行緒會被掛起(相當於被凍結了),GUI更新會被保存在一個佇列中等到JS引擎空閒時立即執行。
2、JS引擎執行緒(「JavaScript 引擎」通常被稱為一種 虛擬機。也稱為JS內核,負責處理Javascript腳本程式。(例如V8引擎)• JS引擎執行緒負責解析Javascript腳本,執行程式碼。• JS引擎一直等待著任務佇列中任務的到來,然後加以處理,一個Tab頁(renderer進程)無論何時都只有一個JS線程在運行JS程式• 同樣注意,GUI渲染線程與JS引擎線程是互斥的,所以如果JS執行的時間過長,這樣就會造成頁面的渲染不連貫,導致頁面渲染載入阻塞。3、事件觸發線程• 歸屬於瀏覽器而不是JS引擎,用來控制事件循環(可以理解,JS引擎自己都忙不過來,需要瀏覽器另開線程協助)• 當JS引擎執行程式碼區塊如setTimeOut時(也可來自瀏覽器核心的其他執行緒,如滑鼠點擊、AJAX非同步請求等),會將對應任務新增到事件線程中• 當對應的事件符合觸發條件被觸發時,該線程會把事件加到待處理佇列的隊尾,等待JS引擎的處理• 注意,由於JS的單執行緒關係,所以這些待處理佇列中的事件都得排隊等待JS引擎處理(當JS引擎空閒時才會去執行)4. 定時觸發器執行緒• 傳說中的setInterval與setTimeout所在線程• 瀏覽器定時計數器並不是由JavaScript引擎計數的,(因為JavaScript引擎是單線程的, 如果處於阻塞線程狀態就會影響記計時的準確)• 因此透過單獨執行緒來計時並觸發定時(計時完畢後,加入到事件佇列中,等待JS引擎空閒後執行)• 注意,W3C在HTML標準中規定,規定要求setTimeout中低於4ms的時間間隔算為4ms。5、異步http請求線程• 在XMLHttpRequest在連線後是透過瀏覽器新開一個執行緒請求• 將偵測到狀態變更時,如果設定有回呼函數,非同步執行緒就產生狀態變更事件,將這個回呼再放入事件佇列中。接著由JavaScript引擎執行。
GUI渲染執行緒與JS引擎執行緒互斥:
由於JavaScript是可操縱DOM的,如果在修改這些元素屬性同時渲染介面(即JS線程和UI線程同時運行),那麼渲染線程前後獲得的元素資料就可能不一致了。因此為了防止渲染出現不可預期的結果,瀏覽器設定GUI渲染線程與JS引擎為互斥的關係,當JS引擎執行時GUI線程會被掛起,GUI更新則會被保存在一個隊列中等到JS引擎線程空閒時立即被執行。
js執行機制:js是單執行緒的,每當執行函數就把函數推入堆疊中,但有非同步的操作就讓瀏覽器的執行緒(webAPI)去處理,處理完放到任務佇列裡,當主執行緒(執行棧)執行完畢時,如果任務佇列裡有任務,就執行。
這也就是為什麼下面程式碼會先輸出b,然後是a的原因。 settimeout的函數會放到任務佇列中,而console.log('b')是主執行緒。
setTimeout(() => { console.log('a'); }, 0); console.log('b');
本文來自 js教學 欄目,歡迎學習!
以上是淺談javascript執行機制的詳細內容。更多資訊請關注PHP中文網其他相關文章!

C 和JavaScript通過WebAssembly實現互操作性。 1)C 代碼編譯成WebAssembly模塊,引入到JavaScript環境中,增強計算能力。 2)在遊戲開發中,C 處理物理引擎和圖形渲染,JavaScript負責遊戲邏輯和用戶界面。

JavaScript在網站、移動應用、桌面應用和服務器端編程中均有廣泛應用。 1)在網站開發中,JavaScript與HTML、CSS一起操作DOM,實現動態效果,並支持如jQuery、React等框架。 2)通過ReactNative和Ionic,JavaScript用於開發跨平台移動應用。 3)Electron框架使JavaScript能構建桌面應用。 4)Node.js讓JavaScript在服務器端運行,支持高並發請求。

Python更適合數據科學和自動化,JavaScript更適合前端和全棧開發。 1.Python在數據科學和機器學習中表現出色,使用NumPy、Pandas等庫進行數據處理和建模。 2.Python在自動化和腳本編寫方面簡潔高效。 3.JavaScript在前端開發中不可或缺,用於構建動態網頁和單頁面應用。 4.JavaScript通過Node.js在後端開發中發揮作用,支持全棧開發。

C和C 在JavaScript引擎中扮演了至关重要的角色,主要用于实现解释器和JIT编译器。1)C 用于解析JavaScript源码并生成抽象语法树。2)C 负责生成和执行字节码。3)C 实现JIT编译器,在运行时优化和编译热点代码,显著提高JavaScript的执行效率。

JavaScript在現實世界中的應用包括前端和後端開發。 1)通過構建TODO列表應用展示前端應用,涉及DOM操作和事件處理。 2)通過Node.js和Express構建RESTfulAPI展示後端應用。

JavaScript在Web開發中的主要用途包括客戶端交互、表單驗證和異步通信。 1)通過DOM操作實現動態內容更新和用戶交互;2)在用戶提交數據前進行客戶端驗證,提高用戶體驗;3)通過AJAX技術實現與服務器的無刷新通信。

理解JavaScript引擎內部工作原理對開發者重要,因為它能幫助編寫更高效的代碼並理解性能瓶頸和優化策略。 1)引擎的工作流程包括解析、編譯和執行三個階段;2)執行過程中,引擎會進行動態優化,如內聯緩存和隱藏類;3)最佳實踐包括避免全局變量、優化循環、使用const和let,以及避免過度使用閉包。

Python更適合初學者,學習曲線平緩,語法簡潔;JavaScript適合前端開發,學習曲線較陡,語法靈活。 1.Python語法直觀,適用於數據科學和後端開發。 2.JavaScript靈活,廣泛用於前端和服務器端編程。


熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

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

熱門文章

熱工具

禪工作室 13.0.1
強大的PHP整合開發環境

DVWA
Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

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

SublimeText3 英文版
推薦:為Win版本,支援程式碼提示!

SublimeText3漢化版
中文版,非常好用