JavaScript執行機制(堆、棧、訊息佇列)
阿新 • • 發佈:2019-01-06
棧
JavaScript是單執行緒語言,主執行緒執行同步程式碼。
函式呼叫時, 便會在記憶體形成了一個“呼叫記錄”, 又稱“呼叫幀”, 儲存呼叫位置和內部變數等資訊。 如果函式內部還呼叫了其他函式,那麼在呼叫記錄上方又會形成一個呼叫記錄, 所有的呼叫記錄就形成一個“呼叫棧”。
(尾呼叫、尾遞迴優化)
堆
物件被分配在一個堆中,一個用以表示一個記憶體中大的未被組織的區域。
訊息佇列與事件迴圈Event Loop
一個 JavaScript 執行時包含了一個待處理的訊息佇列(非同步任務),(內部是不進入主執行緒,而進入”任務佇列”(task queue)的任務。比如UI事件、ajax網路請求、定時器setTimeout和setInterval等。
每一個訊息都與一個函式(回撥函式callback
這個過程是迴圈不斷的,所以整個的這種執行機制又稱為Event Loop(事件迴圈)。
小結
JS是單執行緒, 主執行緒執行同步程式碼, 事件、I/O操作等非同步任務,將會進入任務佇列執行,非同步執行有結果之後,就會變為等待狀態, 形成一個先進先出的執行棧,主執行緒的同步程式碼執行完之後,再從”任務佇列”中讀取事件, 執行事件非同步任務的回撥。
這就是為什麼執行順序是, 同步 > 非同步 > 回撥
更簡單的說:只要主執行緒空了(同步),就會去讀取”任務佇列”(非同步),這就是JavaScript的執行機制。