浏览器事件循环机制以及同异步理解

首先介绍几个相关的概念

  • 执行栈

    我们知道执行栈会存储和管理代码执行过程中的执行上下文,通过频繁的入栈退栈操作执行上下文,并执行每个执行上下文内部的代码。常规的同步代码就是这样执行的。

    那么异步代码怎么执行呢?首先我们明确一个概念:任务源。什么是任务源?比如我们在同步代码中开启一个定时器setTimeOut,这个setTimeOut就是任务源,setTimeOut内部会传入回调函数,这个回调函数即为要执行的异步代码

    执行栈在遇到任务源时,不会像执行同步代码那样直接执行它的回调函数,而是会将异步代码添加任务队列中。

  • 任务队列

    上面我们提到了任务队列是用来存放异步代码的容器。任务队列根据其存放异步代码的类型可以分为两种,宏任务队列微任务队列,分别用来存放宏任务微任务

  • 宏任务&微任务

    一段异步代码属于宏任务还是微任务其实是由任务源决定的。

    常见的宏任务:setTimeout、setInterval、requestAnimationFrame内部的回调、script(整体代码)

    常见的微任务:promise.then中的回调,nextTick中传入的回调,MutationObserver

事件循环机制流程

  1. 主线程生成执行栈开始执行一段代码,同步代码优先执行,执行过程中遇到任务源时,判断这个任务源是宏任务源还是微任务源。
  2. 如果是宏任务源,将其内部宏任务添加到宏任务队列中,如果是微任务源,将其内部微任务添加到微任务队列
  3. 等同步代码执行完毕,执行栈进入闲置状态,检查微任务队列中是否有微任务,如果有,执行栈会依次执行这些微任务。
  4. 渲染UI
  5. 检查宏任务队列中是否有宏任务,如果有,取出宏任务队列中最前面的那个宏任务,推入到执行栈中开始执行。执行完毕后重复步骤3-5直到宏任务队列和微任务队列全部清空

注意:

根据上面的流程,我们知道如果一段同步代码中同时有一个宏任务源和一个微任务源,那么微任务一定会比宏任务先执行

每次执行栈在访问微任务队列时,会将当前微任务队列清空,但访问宏任务队列时,只会执行队列最上方的宏任务

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
浏览器事件循环机制是一种执行模型,用于处理浏览器中的异步任务。它的基本原理是通过一个事件队列来管理异步任务的执行顺序,确保每个任务都能按照规定的顺序得到执行。 事件循环机制的核心是事件循环线程,它负责处理所有的异步任务。当浏览器遇到一个异步任务时,它会将任务添加到事件队列中,然后继续执行同步任务。当同步任务执行完毕后,事件循环线程会开始从事件队列中取出任务,按照顺序执行它们。 事件循环机制的另一个重要的概念是回调函数,它是异步任务完成后需要执行的函数。当浏览器取出一个任务时,它会检查该任务是否有回调函数,如果有,就执行该函数。如果没有,就直接进入下一个任务。 事件循环机制的实现还涉及到一些微任务和宏任务的概念。微任务是指在当前任务执行完毕后立即执行的任务,而宏任务则是指需要等到下一个事件循环周期才执行的任务。常见的微任务包括Promise的then()和catch()方法、MutationObserver的回调函数等,而常见的宏任务包括setTimeout、setInterval、requestAnimationFrame等。 总之,浏览器事件循环机制的原理是通过一个事件队列来管理异步任务的执行顺序,确保每个任务都能按照规定的顺序得到执行。它是浏览器中实现异步任务的核心机制理解它对于开发高效的异步代码非常重要。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值