众所周知,JavaScript在浏览器上运行机制是单线程的,这是在浏览器发展的初期就决定的特点。就像一个人要起床,刷牙洗脸,出门,这是无法同时进行的,只能按照一定的顺序执行。
假设运行下面的代码:
console.log(1);
setTimeout(() => {
console.log(2);
}, 0);
new Promise(resolve => {
console.log(3);
resolve();
}).then(() => {
console.log(4);
});
console.log(5);
这段代码的所有同步代码会被创建成一个宏任务插入到任务队列,依次打印1、3、5
setTimeout会创建宏任务插入到宏任务,打印2
Promise的then会创建微任务插入到微任务队列,打印4
因为单线程的原因,这三个任务会按照 宏任务->微任务 顺序执行,而Promise的then会在当前宏任务的结束后紧跟着执行,所以打印顺序为1、3、5、4、2。