爲便於理解,在進入正題以前,不得不說如下一些基本的概念。前端
是操做系統結構的基礎;linux
是系統進行資源分配和調度的基本單位;面試
在linux系統中可使用ps-ef
來查詢進程列表(以下圖)。比進程更小的單位叫作線程
。 promise
是操做系統可以進行運算調度的最小單位;瀏覽器
它被包含在進程之中,是進程中的實際運做單位;一個進程能夠併發
多個線程,每條線程並行
執行不一樣的任務。併發
先進後出
的原則。以上咱們講到了進程與線程
,同步與異步
,執行棧
,主線程
等,那麼JS究竟是怎麼運行的呢?異步
先來供上一個常見面試題,寫出如下代碼的執行結果async
console.log('start')
setTimeout(() => {
console.log('setTimeout')
}, 0)
new Promise(resolve => {
console.log('promise')
resolve()
}).then(() => {
console.log('then1')
}).then(() => {
console.log('then2');
})
console.log('end')
複製代碼
結果以下圖:函數
爲何setTimeout最後輸出呢???oop
JS代碼的執行其實就是往執行棧中放入函數。那麼遇到異步代碼的時候該怎麼辦呢?其實當遇到異步代碼時,會被掛起並在須要執行的時候加入到任務隊列
。一旦執行棧爲空,Event Loop 就會從任務隊列中拿出須要執行的代碼並放入執行棧中執行。
JS引擎常駐於內存中,等待宿主將JS代碼或函數傳遞給它,也就是等待宿主環境分配宏觀任務,反覆等待 - 執行即爲事件循環。
Event Loop中,每一次循環稱爲tick,每一次tick的任務以下:
script
),執行其同步代碼直至結束;本文主要介紹了JS運行機制,即Event Loop,及其相關的一系列概念。
若有問題,歡迎指正。