1. 程式人生 > >JavaScript執行機制(堆、棧、訊息佇列)

JavaScript執行機制(堆、棧、訊息佇列)

JavaScript是單執行緒語言,主執行緒執行同步程式碼。
函式呼叫時, 便會在記憶體形成了一個“呼叫記錄”, 又稱“呼叫幀”, 儲存呼叫位置和內部變數等資訊。 如果函式內部還呼叫了其他函式,那麼在呼叫記錄上方又會形成一個呼叫記錄, 所有的呼叫記錄就形成一個“呼叫棧”。

(尾呼叫、尾遞迴優化)

物件被分配在一個堆中,一個用以表示一個記憶體中大的未被組織的區域。

訊息佇列與事件迴圈Event Loop

一個 JavaScript 執行時包含了一個待處理的訊息佇列(非同步任務),(內部是不進入主執行緒,而進入”任務佇列”(task queue)的任務。比如UI事件、ajax網路請求、定時器setTimeout和setInterval等。
每一個訊息都與一個函式(回撥函式callback

)相關聯。當棧為空時,從佇列中取出一個訊息進行處理。這個處理過程包含了呼叫與這個訊息相關聯的函式(以及因而建立了一個初始堆疊幀)。當棧再次為空的時候,也就意味著訊息處理結束。

這個過程是迴圈不斷的,所以整個的這種執行機制又稱為Event Loop(事件迴圈)。

小結

JS是單執行緒, 主執行緒執行同步程式碼, 事件、I/O操作等非同步任務,將會進入任務佇列執行,非同步執行有結果之後,就會變為等待狀態, 形成一個先進先出的執行棧,主執行緒的同步程式碼執行完之後,再從”任務佇列”中讀取事件, 執行事件非同步任務的回撥。
這就是為什麼執行順序是, 同步 > 非同步 > 回撥
更簡單的說:只要主執行緒空了(同步),就會去讀取”任務佇列”(非同步),這就是JavaScript的執行機制。