在ES3 或者 更早的版本中,JavaScript並無異步操作,所以代碼給到JavaScript引擎,它就直接順次的執行,這個任務是宿主發起的任務我們可以稱之爲宏觀任務(macrotask)。
在ES5 或者 之後的版本,JavaScript出現了Promise,這就不需要瀏覽器的安排,引擎自己也可以發起任務,這個任務就叫做微觀任務(microtask)
- 下面是自我總結,太標準的語言說起來太難理解,我們通俗一點唄。
宏觀任務
需要JavaScript引擎來執行的
包括整體script代碼,setInterval,setTimeout等事件
微觀任務
需要JavaScript引擎來執行的
promise ,process.nexttrick(nodejs的內容)
代碼體現
setTimeout(() => {
console.log(1);
process.nexttrick( () => console.log(5))
},0);
new Promise((resovle,reject) => {
console.log(2);
resovle();
}).then(() => console.log(3))
console.log(4);
})
//執行結果執行順序就是2,4,3,1,5
接下來我們看一下上面那張圖解來解答吧!
首先我們找到宏任務,也就是整體代碼,定時器等。那麼開始執行整體代碼,執行promise中的整體代碼輸出2,然後就是輸出4,這時所有的整體代碼已執行完畢,繼續查找當前已執行的代碼中是否包含微任務,我們可以知道promise.then是微任務那麼就是執行輸出3,接着查找其他的宏任務那就是setTimeout輸出1,再輸出微任務5啦。
所以執行順序就是2,4,3,1,5