首先咱们要知道浏览器是由什么组成的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的事件环和任务队列里面微任务和宏任务的关系