这里有段代码
function a() {
console.log(1);
Promise.resolve().then(function aFn() {
console.log(2);
});
}
setTimeout(function fn2() {
console.log(3);
Promise.resolve().then(a);
}, 8);
Promise.resolve().then(function fn3() {
console.log(4);
});
console.log(5);
JS执行顺序如下:
- 渲染主线程执行全局的JS代码。
- 从上到下执行,遇到函数声明,未执行先跳过。
- 遇到
setTimeout ,交给延时线程处理,开始计时8毫秒后,将回调函数fn2包装成任务推入到延时队列中,渲染主线程继续往下执行。
- 遇到
Promise.resolve().then(fn3),将回调函数fn3包装成任务放入微任务队列。
- 执行
console.log(5),控制台输出5。
- 按优先级先找微任务队列(最高),取其中的任务
fn3到渲染主线程中执行,即输出4。
- 到延时队列(中)中取任务
fn2到渲染主线程中执行,遇到console.log(3),控制台输出3。
- 遇到微任务
Promise.resolve().then(a),将回调函数a包装成任务放到微任务队列中等待执行。
- 渲染主线程清空,查看微任务队列,取任务
a到渲染主线程中执行。
- 遇到
console.log(1),控制台输出1。
- 遇到
Promise.resolve().then(aFn),将回调aFn包装成任务放入微任务队列。
- 渲染主线程清空,查看微任务队列,取任务
aFn到渲染主线程中执行。
- 遇到
console.log(2),控制台输出2。
- 按照先后顺序依次输出,5、4、3、1、2。