javasctipt是一門單線程的非阻塞的腳本語言,單線程意味著,JavaScript
單線程意味著,javascript代碼在執行的任何時候,都只有一個主線程來處理所有的任務。
JavaScript的事件分兩種,宏任務(macro-task)和微任務(micro-task)
宏任務:包括整體代碼script,setTimeout,setInterval
微任務:Promise.then(非new Promise),process.nextTick(node中)
- 事件的執行順序,
是先執行宏任務,然后執行微任務
,這個是基礎,任務可以有同步任務和異步任務,同步的進入主線程,異步的進入Event Table并注冊函數,異步事件完成后,會將回調函數放入Event Queue中(宏任務和微任務是不同的Event Queue
),同步任務執行完成后,會從Event Queue中讀取事件放入主線程執行,回調函數中可能還會包含不同的任務,因此會循環執行上述操作。
舉個例子
? ??setTimeout(
function()
{
console.log('setTimeout');
},1000)
new Promise(function(resolve)
{ console.log('promise');
}).then(
function() {
console.log('then');
})
console.log('console');
//2,4,3,1.
-
先執行
script
同步代碼先執行new Promise中的console.log(2),then后面的不執行屬于微任務 然后執行console.log(4)
- 執行完
script
宏任務后,執行微任務,console.log(3),沒有其他微任務了。 - 執行另一個宏任務,定時器,console.log(1)。
?