浅谈JS宏任务和微任务理解

本文深入浅出地介绍了JavaScript的宏任务和微任务,包括它们的执行机制、优先级以及在事件循环中的作用。重点讲解了script作为宏任务、Promise和MutationObserver作为微任务的执行顺序,并通过实例解析了事件循环的流程,最后讨论了requestAnimationFrame的特殊性质,它既不属于宏任务也不属于微任务,但扮演着重要的角色。
摘要由CSDN通过智能技术生成
一、抛出JS机制、任务 (task)

    js的核心特征是单线程,意味着所有任务需要排队,前一个任务结束,才会执行后一个任务。如果前一个任务耗时很长,后一个任务就不得不一直等着。于是就有了现在的两种任务类型:同步任务(synchronous),和异步任务(asynchronous)。
    同步任务指在主线程上排队执行的任务,只有前一个任务执行完毕,才能执行后一个任务;异步任务指不进入主线程、而进入"任务队列"(task queue)的任务,只有"任务队列"通知主线程,某个异步任务可以执行了,该任务才会进入主线程执行。

二、了解异步执行运行机制

   tips: 同步执行可被视为没有异步任务的异步执行,执行也是如此。

  1. 所有同步任务都在主线程(main thread)上执行,形成一个执行栈(execution context stack)。
  2. 主线程之外,存在一个"任务队列(task queue)"。只要异步任务有了运行结果,就在"任务队列"之中放置一个事件。
  3. 一旦"执行栈"中的所有同步任务执行完毕,系统就会读取"任务队列",看看里面有哪些事件。那些对应的异步任务,于是结束等待状态,进入执行栈,开始执行。
  4. 主线程不断重复第三步。
    在这里插入图片描述

    "任务队列"是一个先进先出的数据结构,排在前面的事件,优先被主线程读取。主线程的读取过程基本上是自动的,执行栈一清空,"任务队列"上第一位的事件自动进入主线程。但是由于"定时器"的存在,主线程首先要检查一下执行时间,某些事件到规定的时间,才能返回主线程。
堆(heap)、栈(stack)、事件循环(Event Loop)

三、引出宏任务和微任务

    进入正题,除了广义的同步任务和异步任务,我们对任务有更精细的定义如下,微任务的优先级比宏任务高,只要微任务队列里面有任务,宏任务队列永远得不到执行:

宏任务(Macrotask) 微任务(Microtask)
setTimeout process.nextTick(Node环境)
setInterval MutationObserver(浏览器环境)
MessageChannel Promise[ then / catch / finally ]
setImmediate(Node环境)
script(整体代码块)
I/O操作
UI渲染
  • 宏任务优先级:主代码块 > setImmediate > MessageChannel > setTimeout / setInterval>I/O>UI rendering
  • 微任务优先级:process.nextTick > Promise > MutationObserver
    tips:另外还有一个requestAnimationFrame
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值