javascript中的宏任务和微任务

本文详细解析了宏任务(如script、setTimeout)和微任务(如Promise.then)在JavaScript事件循环中的运行规则,通过实例说明了它们的执行顺序和交互方式。

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

      之前的话我自己也是在网上查了很多的资料,关于宏任务和微任务的执行时机,以下的是我自己做的关于宏任务和微任务的小总结。

 首先看一下事件循环机制的基础模型

   1. 由各种io操作 (setTimeout/ ajax) 生成的事件会被先放到任务队列中等待被执行

   2. 任务队列有一个特点 谁先进入谁先执行

   3. 任务队列中的代码 只有成功进入到主线程 才能被执行

哪些是宏任务,哪些是微任务呢?

宏任务:script整体代码,setTimeout,setInterval

微任务:promise.then ,process.nextTick。

宏任务和微任务之间有什么关系呢?

1. 任务队列中描述的只有宏任务

2.每一个宏任务都会绑定一个属于自己的微任务队列 当前宏任务中的同步代码执行完毕之后 会检查当前微任务队列中是否有微任务 如果有全部遍历执行  执行完毕所有的微任务之后 才会执行下一个宏任务

3. 当前宏任务中如果在执行的过程中又产生了新的宏任务 直接去任务队列中排队

4.当前的宏任务又产生了新的微任务  直接放到当前宏任务绑定的微任务队列中等待执行

5. 当前的微任务中又生成了新的微任务 同样会放到当前微任务所属宏任务中的微任务队里中去

 下面看一道练习题

 console.log(1)

  setTimeout(() => {
    console.log(2)
    setTimeout(() => {
      console.log(6)
    }, 0)
  }, 0)

  Promise.resolve().then(() => {
    console.log(3)
    setTimeout(() => {
      console.log(4)
    }, 0)
  })

  console.log(5)   // 1 5 3 2 4 6

最后的执行结果为 : 1  5  3  2  4  6

让我们再看一下这段代码,首先执行console.log(1),接着遇见了settimeout,这是第二个宏任务,所以直接去任务队列排队,promise.resolve().then属于微任务,所以等待整体script代码,这个第一个宏任务执行完毕,然后console.Log(5),script代码(第一个宏任务)执行完毕,然后插队执行promise.then 这个微任务,执行完后又是一个宏任务settimeout,这是第三个宏任务,遇见新的宏任务就直接去任务队列排队,接着执行第二个宏任务,也就是第一个settimeout,所以打印结果2,执行完后,又遇见了新的宏任务,直接去任务队列里排队,接着执行排在第二个宏任务后的宏任务,所以打印4,最后执行第四个宏任务,打印结果6,所以结果就是 1  5  3  2  4  6

以上是我自己的个人理解,如果有不对的地方,欢迎各位业界大佬指点

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值