javascript
JS线程
最近發現一個問題,setTimeout設置為0時,并不是瞬時0秒后觸發里面的函數,從而牽引出關于js線程的一些問題。從多方資料了解了很多,現在做個總結加深自己的理解,也為一些不知道的朋友做個講解,歡迎指正。
我們從js的線程講起。?
瀏覽器的內核是多線程的,他們相互配合保持同步。一個瀏覽器至少有三個常駐線程,JS引擎線程(用于處理JS事件),GUI渲染線程(用于頁面渲染),事件觸發線程(用于交互)。
幾個要點:
JS引擎線程:是基于事件驅動的,采用單線程運行機制。即JS引擎會只會按順序從JS隊列中取任務并執行。所以無論什么時候都只有一個JS線程在運行JS程序
GUI渲染線程:與JS引擎線程是互斥的,在頁面渲染時啟用。所以頭部加載JS文件與加載CSS文件會發生阻塞現象。
當一個事件被觸發時該線程會把事件添加到JS隊列的隊尾,等待JS引擎的處理。如setTimeout、Ajax、鼠標點擊事件等。
JS引擎分析:(網上圖片)?
事件會不斷按順序存入JS隊列,由JS引擎按順序執行。?
要點:?
1.JS引擎執行到setTimeout的時候,會啟動一個計時器添加在該JS隊列后面,等到執行到計時器時,再進行延遲操作,所以setTimeout為0時也不是即刻執行
2.JS引擎執行到Ajax時,瀏覽器會分發出一個線程專門處理回調,當產生狀態變更時,事件會加入JS隊列等待處理。這就是所謂的異步
其實JS隊列也不是一定按順序執行,不同瀏覽器會有不同的事件循環來輪詢JS隊列,找出更優先的事件,當然,這部分內容屬于高深內容,等我升級了再學,現在只要記住按順序就行了
一次事件改變頁面的JS線程簡單示意圖:?
轉載于:https://www.cnblogs.com/ZpandaZ/p/7397071.html
總結
- 上一篇: Spark MLlib编程API入门系列
- 下一篇: 一路慢行的JavaScript之旅(ad