JavaScript 是一門單線程的語言,這意味着它隻有一個調用棧,是以,它同一時間隻能做一件事。如果我們運作到一個函數,它就會将其放置到棧頂。當從這個函數傳回的時候,就會将這個函數從棧頂彈出,這就是調用棧做的事情。

引傳入連結接 :
macro-task(宏任務):包括整體代碼script,setTimeout,setInterval
micro-task(微任務):Promise,process.nextTick
進入整體代碼(宏任務)後,開始第一次循環。接着執行所有的微任務。然後再次從宏任務開始,找到其中一個任務隊列執行完畢,再執行所有的微任務。
首先進入整體代碼(宏任務)
遇到SetTimout,将其回調函數console.log 加入宏任務的Event Queue
遇到 new Promise 執行 ,将.then加入到微任務
遇到 console.log 執行
整個script代碼(宏任務)這個時候已經執行,然後檢查微任務發現有 一個.then的微任務,執行他
第一輪宏代碼已經執行完成,開始了第二輪,檢查宏任務的Event Queue,發現了setTimeout,執行他。