JS相关八股之什么是事件循环

在JavaScript中,"事件循环"(Event Loop)是一个非常重要的概念,它是指JavaScript引擎如何在单线程中处理异步操作的机制。单线程意味着在任意时刻,JavaScript代码只能执行一个任务。

一.事件循环的工作流程大致如下:

  1. 执行栈(Call Stack)

    • 当一个脚本开始执行时,它首先会进入执行栈。这里会按照顺序执行代码中的函数调用。
    • 执行栈是一个LIFO(后进先出)结构,最新添加到栈的任务会被首先完成。当前正在执行的函数将位于栈顶。
  2. 任务队列(Task Queue)

    • 当异步事件(如setTimeoutsetInterval、I/O、UI事件等)到达预定目标时,相应的回调函数会被放入任务队列。
    • 这些回调函数会等待当前执行栈中的所有任务都完成,即执行栈被清空。
  3. 事件循环

    • 一旦执行栈空了,事件循环就会从任务队列中取出排在最前面的任务,然后将其放入执行栈中去执行。
    • 这个过程是循环进行的,因此被称作"事件循环"。

二.宏任务与微任务:

在现代JavaScript引擎中,任务队列又被分为宏任务(Macro Task)队列和微任务(Micro Task)队列。

  • 宏任务 :包括setTimeoutsetInterval、I/O、UI事件等。
  • 微任务 :包括Promise的回调、Object.observe的变化回调、MutationObserver的回调等。

执行栈为空时,事件循环首先会检查微任务队列。如果微任务队列不为空,事件循环会连续执行微任务队列中所有的任务,直到微任务队列为空。之后,事件循环才会执行一个宏任务。完成宏任务后,事件循环又会检查微任务队列,这个过程会反复进行。

这种机制确保了微任务有更高的优先级和更快的响应时间,因为它们不需要等待下一轮事件循环。

事件循环是JavaScript实现异步编程的核心,它允许JavaScript引擎在执行长时间运行的任务时,仍然可以处理UI更新,接收用户输入,以及在合适的时间执行异步操作的回调。理解事件循环对于编写高效的异步代码至关重要。

相关推荐
布莱克60517 分钟前
数组详解:定义、作用、应用场景及与链表的区别(C/C++ 代码讲解)
c语言·开发语言·c++·数组
hongmai66688830 分钟前
MP2348GTL-Z:这颗24V/4A同步降压芯片,把性能和体积平衡得恰到好处
c语言·开发语言·arm开发·单片机·5g
多弗朗皮卡丘33 分钟前
C语言梦开始的地方19:文件操作
c语言·开发语言
Dovis(誓平步青云)34 分钟前
折叠屏悬停看视频,上半屏和下半屏应该各做什么
android·java·服务器·开发语言·安全·音视频
benchmark_cc1 小时前
Python量化实战:如何检测并剔除历史数据中的“闪崩/乌龙指”异常价格点?
开发语言·人工智能·python·量化·quantdash·量化数据源
2501_937860941 小时前
Java多线程初阶(下)—— synchronized、volatile、wait/notify与经典并发工具
java·开发语言·jvm
笨笨饿1 小时前
#135_代码中的类型重定义艺术:从基础封装到函数类型设计
开发语言·stm32·单片机·嵌入式硬件·mcu·物联网·嵌入式实时数据库
统计学小王子1 小时前
R语言入门——ggplot2图例增加公式
开发语言·r语言
牛油果子哥q1 小时前
C++内存池与对象池精讲:内存碎片、自定义分配器、对象池实现、STL allocator原理、工程落地与性能对比
java·开发语言·c++
ruanCat1 小时前
Prettier 明明执行成功,Markdown 为什么还是没变?一次插件误诊复盘
前端·javascript·node.js