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