loading...
上次更新: 2024-05-10
首先要先知道幾個概念:
setTimeout、XMLHttpRequest ...等,運作於瀏覽器端,並不是 JavaScript 引擎的一部分,所以他們可以同時執行。
由上而下執行 Call Stack 裡的內容
檢查 Stack 是否為空,如果它為空,表示目前沒有待處理的同步程式碼。
如果遇到異步任務,執行環境會調用相關的 API (例如在瀏覽器上會調用 Web API),等待此異步任務的結果之後,再被放置到 Task Queue 中。
事件循環接下來會讀取 Task Queue,並將任務隊列第一個,加到執行棧中運行。
當 Call Stack 為空,就讀取 Task Queue,不斷重複這個步驟,直到所有任務完成。
Script (整體程式碼)、setTimeout、setInterval、UI渲染、事件Promise 的 then、catch、finally 方法、MutationObserver、await 後的程式碼Srcipt)console.log(123);
setTimeout(() => {
console.log('Hello');
}, 1000);
console.log('World');123;
('World');
('Hello');123WorldHelloconsole 結果為何?console.log('begins');
Promise.resolve().then(() => {
console.log('promise 0');
}).finally(()=>{
console.log('finally');
});
setTimeout(() => {
console.log('setTimeout 1');
Promise.resolve().then(() => {
console.log('promise 1');
});
}, 0);
new Promise(function (resolve, reject) {
console.log('promise 2');
setTimeout(function () {
console.log('setTimeout 2');
resolve('resolve 1');
}, 0);
}).then((res) => {
console.log('dot then 1');
setTimeout(() => {
console.log(res);
}, 0);
});'begins';
'promise 2';
'promise 0';
'finally';
'setTimeout 1';
'promise 1';
'setTimeout 2';
'dot then 1';
'resolve 1';beginspromise 2promise 0finallysetTimeout 1,往下遇到 Promise.resolve,將 then 的 callback 放到 Task Queue 的微任務promise 1setTimeout 2dot then 1resolve 1。參考資料