javascript事件循环个人理解

本文深入剖析JavaScript事件循环机制,包括同步与异步任务的区别、宏任务与微任务的执行顺序及特点,并通过具体代码示例展示任务队列的运作流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

事件循环理解

由来

JS的本质是单线:

  • 一般来说,非阻塞性的任务采取同步的方式,直接在主线程的执行栈完成。

  • 一般来说,阻塞性的任务都会采用异步来执行,异步的工作一般会交给其他线程完成,然后回调函数会放到事件队列中。

执行顺序

  • [宏任务:macro task]

    • 定时器

    • 事件绑定

    • ajax

    • 回调函数

    • Node中fs可以进行异步的I/O操作

  • [微任务:micro task]

    • Promise(async/await) => Promise并不是完全的同步,当在Excutor中执行resolve或者reject的时候,此时是异步操作,会先执行then/catch等,当主栈完成后,才会再去调用resolve/reject把存放的方法执行

    • process.nextTick (node中实现的api,把当前任务放到主栈最后执行,当主栈执行完,先执行nextTick,再到等待队列中找)

    • MutationObserver (创建并返回一个新的 MutationObserver 它会在指定的DOM发生变化时被调用。)

任务队列到达时间后先进先出的原则

这里我省略了同步任务,空白就相当于是同步任务,红色代表宏任务,蓝色代表微任务
没啥
在这里插入图片描述

 console.log(1);
  document.addEventListener("14", function () {
    console.log(14);
  });
  new Promise(function (resolve) {
    resolve();
    console.log(2);
    setTimeout(function () {
      console.log(3);
    }, 0);
    Promise.resolve().then(function () {
      console.log(4);
      setTimeout(function () {
        console.log(5);
      }, 0);
      setTimeout(function () {
        (async function () {
          console.log(6);
          return function () {
            console.log(7);
          };
        })().then(function (fn) {
          console.log(8);
          fn();
        });
      }, 0);
    });
    new Promise(function (resolve) {
      console.log(9);
      resolve();
    }).then(function () {
      new Promise(function (resolve, reject) {
        console.log(10);
        reject();
      })
        .then(function () {
          setTimeout(function () {
            console.log(11);
          }, 0);
          console.log(12);
        })
        .catch(function () {
          console.log(13);
          var evt = new Event("14");
          document.dispatchEvent(evt);
        });
    });
  });
  setTimeout(function () {
    console.log(15);
    Promise.resolve().then(function () {
      console.log(16);
    });
  }, 0);

//答案是1 2 9 4 10 13 14 3 15 16 5 6 8 7


首先侦听事件是在等待后的同步任务
第二个是在reject的时候会被catch捕获不会进入then之后的代码
第三个就是在参数fn执行了之后才会返回return的 7

参考

js中的同步和异步,宏任务和微任务,async和await~李疆

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MaxLoongLvs

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值