JS在瀏覽器中的執行機制

binbin愛學習發表於2019-01-03

對JS執行機制進行一些梳理

單執行緒

JS是單執行緒執行的,但並不代表瀏覽器只有一個執行緒,它還包括:

  • UI渲染執行緒
  • 瀏覽器事件觸發執行緒
  • http請求執行緒
  • 計時器執行緒
  • EventLoop輪詢的處理執行緒

JS可以操作dom,影響渲染,所以JS執行緒和UI執行緒是互斥的,這也就解釋了為什麼JS執行時會阻塞頁面的渲染。

單個JS檔案中語句的執行機制

  1. 所有的同步語句,直接執行
  2. 如果遇到非同步任務,就把它放到瀏覽器對應的執行緒中去執行,然後執行下一條語句。非同步任務如果執行完畢,瀏覽器就會將它的回撥函式放到非同步佇列中去
  3. 完成JS檔案的執行

執行棧

JavaScript 只是一個單執行緒的程式語言,這意味著它只有一個執行棧,這樣它只能一次做一件事情。 如果前面的語句沒有返回,那麼後面的語句都會被阻塞調,這就是JS選擇非同步的原因。 執行棧會依次執行當前棧中的程式碼,而把什麼程式碼放入執行棧中,是由事件迴圈決定的

事件迴圈

一個指令碼檔案從第一行開始到最後執行完成可以看作是一個entry task,即初始化任務。這就是事件迴圈中的第一個巨集任務,該巨集任務會首先放入執行棧中執行。而在這個任務中,我們有可能使用了setTimeoutAjaxPromise等介面,這樣我們就在該巨集任務中註冊了很多的非同步任務。非同步任務會直接跳過,接著執行巨集任務中的同步語句,直到當前JS檔案執行完畢,第一個巨集任務就完成了,執行棧為空。此後,事件迴圈執行緒會按照規定的邏輯,把要處理的任務放至JS執行緒的執行棧中

JS在瀏覽器中的執行機制

具體的事件迴圈規則,請參考: javascript事件迴圈(瀏覽器/node)

相關文章