浏览器在执行js代码的过程中会维护一个执行栈,每个方法都会进栈执行之后出栈。
与此同时,又维护了一个消息队列,所有异步方法在执行之后将回调方法传入消息队列。
执行栈中任务执行完再去寻找消息队列中的任务。先进入消息队列的任务先执行
浏览器同时维护了 执行栈 、 消息队列 两条线
执行栈 --(执行完)--> 消息队列(异步方法的回调聚集地)
执行栈中执行 宏任务,当宏任务遇到promise时会创建 微任务
1.执行代码块
2.遇到promise把then中方法放进微任务队列
3.一次宏任务执行完成,检查有无微任务
4.微任务执行
5.下一次宏任务执行
宏任务:
js同步执行的代码块、 setTimeout、 setInterval、 XMLHttpRequest
微任务:
promise、 process、 nextTick
setTimeout(function(){
console.log(1);
},0);
new Promise(function(a,b){
console.log(2);
setTimeout(function(){
a() // 不调用就不走then方法
console.log(8);
},0);
console.log(3);
setTimeout(function(){
console.log(4);
},0);
}).then(function(){
console.log(5)
});
console.log(6);
setTimeout(function(){
console.log(7);
},0);
// 23618547