首先咱們要知道瀏覽器是由什麼組成的javascript
let arr = [];
arr.push(1);
arr.push(2);
console.log(arr.shift()); // 1
複製代碼
同步任務:在主線程上排隊執行的任務,只有前一個任務執行完畢,才能執行後一個任務;java
alert("不關閉後面是不會執行的");
console.log(1);
複製代碼
setTimeout(()=>{
console.log(1);
},300)
setTimeout(()=>{
console.log(3);
},200)
setTimeout(()=>{
console.log(2);
},200)
- 輸出的結果是 3 2 1
複製代碼
異步任務:不進入主線程、而進入"任務隊列"的任務,只有"任務隊列"通知主線程,某個異步任務能夠執行了,該任務纔會進入主線程執行。node
for(var i = 0; i < 5; i++){
setTimeout(() =>console.log(i), 0);
}
console.log("ok");
// 先輸出ok,再輸出5個5
複製代碼
微任務的執行順序在宏任務以前ajax
setTimeout(()=>{
console.log("setTimeout1");
},0)
Promise.resolve().then(()=>{
console.log("Promise");
})
process.nextTick(()=>{
console.log("nextTick");
})
// 輸出 nextTick Promise setTimeout1
複製代碼
經過上面的瞭解咱們大體知道瀏覽器是先執行同步任務,執行完以後再執行異步任務。數組
1.全部同步任務都在主線程上執行,造成一個執行棧瀏覽器
2.主線程以外,還存在一個任務隊列。只要異步任務有了運行結果,就在任務隊列之中放置一個事件dom
3.一旦執行棧中的全部同步任務執行完畢,系統就會讀取任務隊列,將隊列中的事件放到執行棧中依次執行異步
4.主線程從任務隊列中讀取事件,這個過程是循環不斷的函數
整個的這種運行機制又稱爲Event Loop(事件循環)
複製代碼
看下面一段代碼oop
setTimeout(function(){
console.log('setTimeout1');
Promise.resolve().then(()=>{
console.log('then1');
});
},0)
Promise.resolve().then(()=>{
console.log('then2');
Promise.resolve().then(()=>{
console.log('then3');
});
setTimeout(function(){
console.log('setTimeout2');
},0)
})
// 輸出結果 then2 then3 setTimeout1 then1 setTimeout2
複製代碼
咱們得出一個結果
瀏覽器的事件環和任務隊列裏面微任務和宏任務的關係
最後再說一下,node的事件環和任務隊列裏面微任務和宏任務的關係