JavaScript 語言的一大特色是單線程。前端
每開一個標籤頁系統就建立一個獨立的進程,一個進程中可能包含如渲染線程、JS 引擎線程、HTTP 請求線程等。
注意:因爲瀏覽器的優化機制某些進程可能會被合併。面試
若是 JavaScript 是多線程的,假定 procces1 和 procces2 同時對同一個 DOM 做出操做,瀏覽器應該以哪個爲準,因此 JavaScript 只能爲單線程。瀏覽器
任務分爲同步任務和異步任務,同步任務會進入主線程,異步任務則會進入事件隊列 ( Event Queue )。主線程中的任務執行完畢後會從事件隊列中取出放入執行棧。bash
任務除了分爲同步任務和異步任務,還分爲微任務和宏任務。多線程
事件循環的執行順序爲異步
示例:函數
setTimeout(() => {
new Promise((resolve) => {
console.log('1')
resolve()
}).then(() => {
console.log('2')
})
console.log('3')
}, 0)
console.log('4')
new Promise(resolve => {
console.log('5')
resolve();
}).then(() => {
console.log('6')
})
setTimeout(() => {
new Promise((resolve) => {
console.log('7')
resolve();
}).then(() => {
console.log('8')
})
console.log('9')
}, 0)
複製代碼
分析:優化
第一輪事件循環:ui
第一輪事件循環結束輸出'4'、5'、'6'spa
第二輪事件循環:
第二輪事件循環結束輸出'1'、'3'、'2'
第三輪事件循環:
第三輪事件循環結束輸出'7'、'9'、'8'
代碼執行完畢輸出結果爲'4'、5'、'6'、'1'、'3'、'2'、'7'、'9'、'8'
參考:前端面試之道