原文地址: https://github.com/lzlu/Blog/issues/7
本文沒有什麼乾貨,只是提供了一個面試題的解答思路。
這個題目是之前面試的時候遇到的,當時沒答對。雖然這種題目看起來對寫程式碼並沒什麼實際意義,但說到底還是自己對JS執行機制不夠深入瞭解。
就拿這題目拿出來分享給大家一些解題思路。 對JS執行機制不夠了解的建議先看了這篇這一次,徹底弄懂 JavaScript 執行機制 - 掘金,再食用。
不多說了,上酸菜,哦不對,題目。
const first = () => (new Promise((resolve,reject)=>{
console.log(3);
let p = new Promise((resolve, reject)=>{
console.log(7);
setTimeout(()=>{
console.log(5);
resolve(6);
},0)
resolve(1);
});
resolve(2);
p.then((arg)=>{
console.log(arg);
});
}));
first().then((arg)=>{
console.log(arg);
});
console.log(4);
複製程式碼
第一輪事件迴圈
先執行巨集任務,主script ,new Promise立即執行,輸出【3】,執行p這個new Promise 操作,輸出【7】,發現setTimeout,將回撥放入下一輪任務佇列(Event Queue),p的then,姑且叫做then1,放入微任務佇列,發現first的then,叫then2,放入微任務佇列。執行console.log(4),輸出【4】,巨集任務執行結束。
再執行微任務,執行then1,輸出【1】,執行then2,輸出【2】。到此為止,第一輪事件迴圈結束。開始執行第二輪。
第二輪事件迴圈
先執行巨集任務裡面的,也就是setTimeout的回撥,輸出【5】。resovle不會生效,因為p這個Promise的狀態一旦改變就不會在改變了。 所以最終的輸出順序是3、7、4、1、2、5。
總結
對JavaScript執行機制有了解,並且知道Promise建構函式是立即執行的,這個題目相信還是很簡單的。