(function test() {
setTimeout(function() {console.log(4)}, 0);
new Promise(function executor(resolve) {
console.log(1);
for( var i=0 ; i<10000 ; i++ ) {
i == 9999 && resolve();
}
console.log(2);
}).then(function() {
console.log(5);
});
console.log(3);
})()
那这道题目举例吧。
为什么输出结果是1,2,3,5,4而非1,2,3,4,5?
既然你已经知道怎么分类了,不就不赘述了。直接说说macrotasks和microtasks的执行顺序吧:
主js作为macro先入队列,编号ma1
执行到setTimeout...,回调作为macro入队列,编号ma2
执行到new Promise...,then作为micro入队列,编号mi1
ma1执行完之前,调用mi1,mi1执行完以后,ma1也就正式的结束了
ma2开始执行
可以认为macro是主人,micro是奴隶,哪个macro创建了micro,micro就管它叫主人。
ma1快死之前,对奴隶mi1说,我要挂了,你一起陪葬吧,mi1说好的便上吊了,ma1看mi1死后,也就安心的去了。
然后ma2也准备要死了,,,
总的来说就是,macro作为主导,它有支配micro的能力,在一个macro任务消灭之前,它会让它创建的micro任务都执行完,然后才进入下一个macro任务。
然后,入栈出栈,这个另一个概念,是每个task执行它的代码的时候发生的,比如变量定义,函数调用,通过栈的入出,计算出结果。