前端事件循环的过程(一段JS代码的执行顺序)

这里有段代码

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执行顺序如下:

  1. 渲染主线程执行全局的JS代码。
  2. 从上到下执行,遇到函数声明,未执行先跳过。
  3. 遇到setTimeout ,交给延时线程处理,开始计时8毫秒后,将回调函数fn2包装成任务推入到延时队列中,渲染主线程继续往下执行。
  4. 遇到Promise.resolve().then(fn3),将回调函数fn3包装成任务放入微任务队列。
  5. 执行console.log(5),控制台输出5
  6. 按优先级先找微任务队列(最高),取其中的任务fn3到渲染主线程中执行,即输出4
  7. 到延时队列(中)中取任务fn2到渲染主线程中执行,遇到console.log(3),控制台输出3
  8. 遇到微任务Promise.resolve().then(a),将回调函数a包装成任务放到微任务队列中等待执行。
  9. 渲染主线程清空,查看微任务队列,取任务a到渲染主线程中执行。
  10. 遇到console.log(1),控制台输出1
  11. 遇到Promise.resolve().then(aFn),将回调aFn包装成任务放入微任务队列。
  12. 渲染主线程清空,查看微任务队列,取任务aFn到渲染主线程中执行。
  13. 遇到console.log(2),控制台输出2
  14. 按照先后顺序依次输出,5、4、3、1、2
posted @ 2023-03-08 11:40  脆皮鸡  阅读(55)  评论(0)    收藏  举报