春節後,新一輪跳槽風暴不知道可否吹暖今冬的裁人寒冬。然而,職場現狀就是愈來愈多的小公司也在效仿各大互聯網牛場面試要求,對於底層知識要求愈來愈深,管他用着用不着的,先面了再說。本篇跟你們聊聊面試常見題型之顯示順序問題。web
注:本篇分析爲在瀏覽器環境中排序顯示。
面試Nodejs編程是全異步,事件引擎爲libuv。
編程
關於運行機制聊四個關鍵點:瀏覽器
JavaScript任務運行機制圖
bash
一、皇帝豪飲兩碗鹿血,問有個叫EventLoop的公公,今晚誰來陪睡,EventLoop掐指一算,正宮幾個「同步任務「娘娘都送過禮,我就按照送禮順序來給她們安排吧。多線程
同步任務優先執行,先進先出。
異步
二、幾晚事後,全部送過禮的「同步任務」娘娘輪流服侍皇帝一遍。如此同時,秀宮的宮女們忙着化妝整容。原來,宮裏有個不成文的規定,只有收拾好本身的宮女才能夠排隊等待皇帝的召喚,到時候公公EventLoop會按照排隊次序向皇帝安排服侍。async
三、何時才輪到宮女們服侍呢?是「同步任務」娘娘們服侍一遍後,畢竟公公EventLoop爲了保護本身的飯碗,得讓皇帝不斷嚐鮮。函數
同步任務執行的同時,異步任務在事件棧完成後,異步任務進入「任務隊列」;
oop事件循環(Event Loop)驅使主線程在所有同步任務完成後,從「任務隊列」讀取事件,如此不斷循環;
任務隊列執行先進先出;
四、在秀宮有兩個宮女姓SetTimeout和setInterval,人老珠黃,雖然化妝技術還能夠,也送過了禮,無奈確實不上檔次,負責秀宮的公公就讓她倆排在了全部宮女的後邊,等着唄。
五、這倆宮女終於看到但願了,可誰知又來一批年輕漂亮的秀女,怎麼辦,等着唄。
六、終於,前先後後好幾批年輕秀麗的宮女們服侍完皇帝,輪到這兩位了,按照老規則,誰先來的誰優先,倆人對視苦笑,回頭一看,又來幾個姓SetTimeout和setInterval的宮女...
同時嵌套在異步操做的任務,會將嵌套在異步的下一次任務隊列中;
定時器任務添加到任務隊列的尾部;
基於今日頭條的面試題改造
async function async1() {
console.log(1)
await async2()
console.log(2)
return await 3
}
async function async2() {
console.log(4)
}
setTimeout(function() {
console.log(5)
}, 0)
async1().then(v => console.log(v))
new Promise(function(resolve) {
console.log(6)
resolve();
console.log(7)
}).then(function() {
console.log(8)
})
console.log(9)複製代碼
setTimeout
,怎奈又不是正宮,長得又不秀麗,只能在任務隊列最後等着。async1.then()
時,async1返回一個Promise
對象(異步函數實際上是封裝的Promise.resolve()
,Promise
對象是一個構造函數),因此在執行async1時,首先將非resolve、reject函數加入主線程,上題中首先執行console.log(1)
和await async2
1,4
。感受await挺孫子的,執行完本身的函數就跳出來async
函數。Promise
對象了,二話不說,執行下先,console.log(6)
、console.log(7)
直接加入到主線程,輸出6,7
。同時將異步函數console.log(8)放在儲秀宮,雖然屬於第二階級,起碼仍是第二階級的老大麼。8
。console.log(2)
,因此輸出了2
。await
了,還好,結束了,返回的值扔給了async
的異步函數,獲得了值,抓緊時間執行,獲得結果了,終於能夠進入任務隊列,這時主線程也是空的,執行下結果吧,輸出了3
。5
。
以上試題分析完畢,輸出結果順序爲:
1,4,6,7,9,8,2,3,5
。
以上是我的對於任務執行順序的理解,如理解有誤,但願大神多多指教。