首页 > 其他分享 >你对事件循环有了解吗?说说看!

你对事件循环有了解吗?说说看!

时间:2024-11-22 11:22:04浏览次数:1  
标签:异步 调用 JavaScript 说说看 任务 循环 事件

我了解事件循环(Event Loop),它是 JavaScript 引擎中处理异步操作的核心机制,对于前端开发至关重要。它负责协调 JavaScript 的单线程执行模型与浏览器或 Node.js 环境提供的各种异步任务(例如网络请求、定时器、用户交互等)。

以下是事件循环的关键概念和运作方式:

  • 调用栈 (Call Stack): JavaScript 引擎使用调用栈来跟踪当前正在执行的函数。当一个函数被调用时,它会被推入栈中;当函数执行完毕后,它会被弹出栈。JavaScript 引擎会同步地执行调用栈中的函数,直到栈为空。

  • Web APIs: 浏览器或 Node.js 提供的 Web APIs 允许 JavaScript 执行异步操作。当 JavaScript 代码调用一个异步 API 时,该操作会被移交给 Web API 处理。

  • 回调队列 (Callback Queue) / 任务队列 (Task Queue / Microtask Queue): 当一个异步操作完成时,它的回调函数会被添加到任务队列中。 这里需要注意区分 MacroTask (macrotask) 和 MicroTask (microtask):

    • MacroTask (宏任务): 包括 setTimeoutsetIntervalsetImmediate (Node.js)、I/O、UI rendering 等。每次事件循环迭代只会处理一个宏任务。
    • MicroTask (微任务): 包括 Promisethen/catch/finallyqueueMicrotaskMutationObserver 等。在每一次事件循环迭代的末尾,事件循环会处理所有处于微任务队列中的微任务,直到微任务队列为空。
  • 事件循环: 事件循环不断地检查调用栈是否为空。如果调用栈为空,它会从任务队列中取出第一个回调函数,并将其推入调用栈执行。这个过程会不断重复,直到任务队列为空。

事件循环的简化流程:

  1. JavaScript 引擎执行代码,同步任务依次进入调用栈。
  2. 遇到异步操作,将其交给 Web APIs 处理。
  3. Web APIs 完成异步操作后,将对应的回调函数添加到任务队列(区分 MacroTask 和 MicroTask)。
  4. 事件循环检查调用栈是否为空。如果为空,则取出任务队列中的第一个 MacroTask,将其回调函数推入调用栈执行。
  5. 执行完 MacroTask 后,检查 MicroTask 队列是否为空。如果不为空,则依次执行所有 MicroTask,直到 MicroTask 队列为空。
  6. 重复步骤 4 和 5。

理解事件循环的重要性:

  • 非阻塞 I/O: 事件循环使得 JavaScript 可以进行非阻塞 I/O 操作,避免了页面卡顿或应用程序冻结。
  • 响应用户交互: 事件循环确保了 JavaScript 能够及时响应用户的交互事件,例如点击、鼠标移动等。
  • 高效的资源利用: 事件循环允许 JavaScript 在等待异步操作完成的同时执行其他任务,提高了资源利用率。

总而言之,事件循环是 JavaScript 并发模型的核心,理解其工作原理对于编写高效、响应迅速的 Web 应用程序至关重要。

希望这个解释能够帮助你理解事件循环。如果你还有其他问题,请随时提出。

标签:异步,调用,JavaScript,说说看,任务,循环,事件
From: https://www.cnblogs.com/ai888/p/18562401

相关文章

  • Cocos Creator引擎开发:物理引擎使用_物理触发器与事件处理
    物理触发器与事件处理在CocosCreator中,物理触发器和事件处理是实现复杂物理交互的重要手段。物理触发器(Trigger)是一种特殊的碰撞体,用于检测物体之间的接触,但不会产生物理响应。事件处理则是当触发器检测到接触时,执行特定的逻辑。物理触发器的基本概念物理触发器在物理世......
  • LOJ2818 循环排序
    题目传送门首先考虑排列怎么做,排序时显然是可以将1移到下标为1的位置,然后把下标为1的位置移到它所应到的位置……直到点应到的位置为1原来的位置,就可以操作一次,使得这些点都归位。于是建图\(G=\langleV,E\rangle,V=\{i\|\1\lei\len\},E=\{(i,a_i)\|\1\le......
  • C语言分支与循环
    引言C语言是结构化的程序设计语言。结构化的程序通常包括数据的描述和操作的描述两方面的内容,结构指的是顺序结构、选择结构、循环结构。算法广义上来讲,算法是解决某一问题的方法和步骤,狭义的算法是对特定问题求解步骤的一种描述。算法的特性和要素:算法的特性有穷性确定......
  • 【C#】【winforms】MVP架构中从 Model 或 View 层主动向 Presenter 传递数据或调用处
    背景使用winforms做上位机软件,软件功能简单来说就是与串口通信。因为一个软件要应用于不同型号的下位机,采用MVP架构提高代码复用性。 其中Model层中实例化SerialPort对象:privateSerialPort_serialPort;只关注串口收发。 presenter层负责主要业务逻辑。view层负责......
  • RNN (循环神经网络 - 从mlp到rnn - 困惑度 - 梯度剪裁) + 代码实现 —— 笔记3.4《动
    0.前言课程全部代码(pytorch版)已上传到附件本章节为原书第8章(循环神经网络),共分为7节,本篇是第4-6节:RNNRNN从零实现RNN简洁实现本节(4-6节)的代码位置为:chapter_recurrent-neural-networks/rnn.ipynbchapter_recurrent-neural-networks/rnn-scratch.ipynbchapte......
  • echarts 绑定事件处理函数
    echartson文档echartsInstance.on(eventName,)https://www.cnblogs.com/Cxymds/p/17491486.htmlhttps://blog.csdn.net/weixin_42079403/article/details/137536279https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&rsv_idx=2&tn=baiduhome_pg&wd=ech......
  • Nuxt.js 应用中的 webpackConfigs 事件钩子
    title:Nuxt.js应用中的webpackConfigs事件钩子date:2024/11/20updated:2024/11/20author:cmdragonexcerpt:在Nuxt.js项目中,webpack:config钩子允许运行时对Webpack配置进行修改。此钩子在配置Webpack编译器之前被调用,使得开发者能根据需要定制和扩展Webpac......
  • Python_字典的循环遍历
     1.遍历字典的key     dict={'name':'tom','age':20,'gender':'男'}forkindict.keys():print(k)  执行结果是2.遍历字典的valuedict={'name':'tom','age':20,'gender':......
  • Qt 重写paintEvent事件划线
    可以自定义一个类QtImageLabel继承于QLabel,重写paintEvent事件划线,写文字等。如果用ui设计,将QLabel控件提升为QtImageLabel类型即可。QtImageLabel.hprotected:voidpaintEvent(QPaintEvent*)override;QtImageLabel.cpp#pragmaexecution_character_set("utf-8......
  • c循环语句 及用法
    什么是循环语句循环语句是编程语言中的一种控制结构,它允许代码块重复执行。简单来说,循环就是让程序重复执行相同的代码块。C++的循环分别有:for循环、while循环和do...while循环。for循环C++的for循环是一种常见的循环语句,它由初始化语句、条件语句和后续语句三个部分组成,并......