Javascript 事件循环说明

2024-02-11

我不断看到“Javascript 事件循环”(即:浏览器 JS 运行时事件循环)的解释,这些解释对我来说似乎不太合理,我希望有人能够提供一些权威的澄清。

我的基本假设是 JS 事件循环就像我们几十年来在 UI 框架中使用的事件循环一样,如下所示:

  // [... some initialization ...]

  // The Event Loop
  while (true) {
    if (! EventQueue.isEmpty()) {
       event = EventQueue.pop_oldest_item();
       event.callback(event [or some other kind of args]);
    }
    // [... defer to other non-JS tasks...]
  }

但我不断看到这样的解释(参见下面的示例):

事件循环:

  1. 检查(Javascript)调用堆栈是否为空。

  2. 检查回调队列 [AKA EventQueue] 是否为空。

  3. 如果调用堆栈为空且回调队列不为空,则:

    A。将最旧的回调队列项目出队。

    b.将该回调函数推送到调用堆栈上(并且没有提及调用该函数。)

  4. 继续循环。

这显然模糊地遵循了我上面假设的模型,但有两个关键且令人不安的差异:

A. 为什么事件循环需要检查 JS 调用堆栈是否为空?当然,每次循环时,调用堆栈都将处于相同的状态(是否完全“空”不是重点——它不需要“检查”)。无论上次调用的函数都将返回,从而恢复堆栈。所以这部分没有意义。

B. 为什么事件循环会“将回调推送到 JS 堆栈上”?事件循环不应该只调用函数,从而创建一个合法的堆栈帧,以及从函数返回的方法,更不用说实际执行函数了?

因此,我希望能够澄清这些解释以及为什么它们实际上是正确的,或者增强我对它们不正确的强烈怀疑。


这些事件循环解释的示例来源:

Philip Roberts:事件循环到底是什么? 14:00https://youtu.be/8aGhZQkoFbQ?t=839 https://youtu.be/8aGhZQkoFbQ?t=839

Typescript 高性能(书籍)第 83 页。

什么是 JavaScript 事件循环?http://altitudelabs.com/blog/what-is-the-javascript-event-loop/ http://altitudelabs.com/blog/what-is-the-javascript-event-loop/

了解 Javascript 函数执行 - 调用堆栈、事件循环、任务等https://medium.com/@gaurav.pandvia/understanding-javascript-function-executions-tasks-event-loop-call-stack-more-part-1-5683dea1f5ec https://medium.com/@gaurav.pandvia/understanding-javascript-function-executions-tasks-event-loop-call-stack-more-part-1-5683dea1f5ec


这是我对你的问题的回答:

JavaScript 以单线程和同步方式运行,因此事件回调函数将在之后执行全局执行上下文从执行堆栈中弹出。所有的事件都会被添加到所谓的事件队列.

当全局执行上下文执行完毕后,JS引擎会不断检查事件队列中是否存在事件。如果 JS 引擎发现有一个事件,那么它会为回调函数创建一个新的执行上下文并将其推送到执行堆栈上。

在 JS 中,每次调用函数时,JS 引擎都会创建一个执行上下文,它创建一个私有作用域,其中函数内部声明的任何内容都无法从当前函数作用域外部直接访问,并推入执行上下文堆栈的顶部。函数执行完毕后,执行上下文将被弹出。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Javascript 事件循环说明 的相关文章

  • 自定义 Javascript EventManager - 请帮我完成

    我正在尝试创建一个自定义 javascript EventManager 类 我采用了 Grant Skinner 在他的 essel js 框架中使用的格式来创建类 并且需要坚持使用它 在这一点上我真的迷失了 我认为 至少在概念意义上 我
  • 如何在 Angular2 中嵌入视频?

    我想开发单页应用程序 它是一个视频门户 用户可以登录 查看视频列表 导航到单个视频 对视频进行评分 并可以执行所有媒体相关任务 例如 播放 暂停 调整音量和寻找视频位置 既然有
  • 如何创建要添加到 JavaScript 对象变量的动态键 [重复]

    这个问题在这里已经有答案了 我正在尝试类似的事情 但这个例子不起作用 jsObj for var i 1 i lt 10 i jsObj key i example 1 我该怎么做才能制作这样的动态密钥 方括号 jsObj key i ex
  • 输入值返回 NaN

    如果有人可以帮助我 因为我不知道为什么控制台中总是有 NaN 一切似乎都很好 该代码应该获取输入值并进行简单的计算 不幸的是 我收到了 NaN 所以我决定使用 console log 来探索值 它向我解释了每个输入的值都是 NaN 我认为这
  • 如何阻止 HTML 输入字段中的特殊字符? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我只是想问一下如何在html输入字段中阻止 等特殊字符 为什么不使用html5呢
  • Node.js npm mssql 函数返回未定义

    我使用 mssql 和 node js 连接到 sql server 数据库 我试图通过将连接代码包装在具有一个查询参数的函数中来减少代码 当我从 router get 函数中的 with 调用该函数时 它返回未定义 任何帮助将非常感激 f
  • 如何在此彩票功能中显示所有猜中的号码?

    我用 JS 创建了一些简单的彩票功能 一切正常 我面临的唯一问题是如何显示所有已猜到的数字 我有 6 个独立的空间 其中必须提供数字 我的目标是显示随机空间中的滚动数字 它必须仅在 6 个空间之一中提供 这对我有用 但只显示 1 个数字 我
  • 打开图层地图,经纬度获取地址

    我正在尝试获取带有经度和纬度的地址 城市 邮政编码 街道地址 但我不知道如何获取 我正在使用开放图层 当我单击地图的一部分时 会获取该位置的经度和纬度 有人有解决方案吗 div class map div
  • RxJS 将三元组中的属性组合到表中

    我有一项服务生成类似于三元组的对象 它们将采用以下格式 country attribute value Example country usa attribute population value 100 country mexico at
  • 如何将 !important 添加到 CSS-in-JS (JSS) 类属性?

    我正在尝试使用一些 CSS in JS 类这个答案 https stackoverflow com questions 54525334 how can i change the label size of a material ui te
  • 设备收到 GCM Android 通知但未显示

    尽管通知已在应用程序本身中注册 但我的 Ionic Android 应用程序的 GCM Cloud 消息通知未出现在我的设备的主屏幕中 我正在使用 npm 模块node gcm https www npmjs com package nod
  • 批量删除如何工作?

    我尝试使用bulkDelete让我的机器人删除其消息 但我收到此错误 node 5724 UnhandledPromiseRejectionWarning Unhandled promise rejection rejection id 1
  • 带条件的 Array.join()

    我该如何使用Array join 有条件的函数 例如 var name aa bb var s name join 输出是 aa bb 我想添加一个条件 仅显示不为空的单词 aa bb 您可以使用Array filter https dev
  • 尝试利用?

    我看到我的 nopCommerce 网站记录了以下搜索 ADw script AD4 alert 202 ADw script AD4 我有点好奇他们想要完成什么 我搜索了一下 似乎是ADw script AD4 以 UTF7 编码为
  • (jQuery) 在 cookie 中单击时保存复选框状态

    关于此功能有很多主题 但我似乎无法让它工作 我在谷歌上搜索了这个具体案例 有一堆链接让我来到这里 但奇怪的是我似乎无法让它们工作 我所做的唯一工作如下 http dl dropbox com u 2238080 a old z htm ht
  • 无法在heroku上推送node.js应用程序

    我尝试在heroku 上推送我的node js 应用程序 但是 无法检测到此应用程序的默认语言 我什至尝试过heroku buildpacks set heroku nodejs 但还是无法推动 Counting objects 31 do
  • 反应本机中的“未知命名模块”错误

    我正在使用 React Native 创建一个应用程序 但某些导入会引发标题中的错误 Unknown named module 两个包都会发生这种情况 react native material design and react nativ
  • 如何提交表单 onkeyup 操作

    我正在尝试保存表格onkeyup行动 我是 jQuery 新手 这可能吗 我很感激任何帮助 编辑1 保存表单意味着保存到服务器 有没有办法增加0 2秒的延迟 此代码将在 keyup 上提交您的表单 element bind keyup fu
  • JavaScript 有内置的 stringbuilder 类吗?

    I see a few 代码项目解决方案 http www codeproject com KB scripting stringbuilder aspx 但是JavaScript中有常规的实现吗 如果您必须为 Internet Explo
  • Google Universal Analytics - 命令被忽略

    我正在使用 Google Universal Analytics 来跟踪页面浏览量 当我导航到具有 Google Analytics 网站实时功能的页面时 我可以看到 因此我的代码一定可以正常工作 然而 Chrome 一直在控制台中显示 I

随机推荐

  • Chrome 扩展程序在内容和后台之间传递消息不起作用

    我正在开发一个 chrome 扩展 以下是主要文件 background js getPageDimension function chrome tabs getSelected null function tab chrome tabs
  • 在 PHP 中加密和解密:快速、简短、有效的 HTML id 和 URL 安全

    任何人都可以建议一种通用的 PHP 加密 解密算法 该算法按以下方式加密 它很快 它很短 类似于 YouTube 的视频 ID 可以用作有效的 id 元素属性 可以安全地用作 URL 的一部分 安全性不是这里的首要问题 我只是想防止偶然的
  • 如何在 HStack 中始终位于中心的 Spacer 之间进行视图?

    我想实现什么 无论两侧的文本宽度如何 按钮都应始终位于文本的中心HStack HStack Text Foooooooo Spacer minLength 5 Button action Text Bar Spacer Text Baz f
  • 使用 python requests 模块的 Facebook 图 GET 请求 - 证书验证失败

    我正在编写一个简短的 python 脚本 以便有趣地检查几页的点赞量 我正在使用 python requests 模块 如下所示 存在一个与证书有关的问题 我对涉及网络的编程相当陌生 所以对我来说我应该做什么并不明显 r requests
  • 在 Android Studio 中使用 libpd

    所以我得到了 git repohttps github com libpd pd for android https github com libpd pd for android并在 Android Studio 中为我的 Amazing
  • kdb/q:如何将字符串操作函数应用于字符串向量以输出字符串向量?

    先谢谢您的帮助 我是 kdb q 的新手 有 Python 和 C 背景 只是一个简单的语法问题 我有一个包含字段及其相应值的字符串 pp str field 1 abc field 2 xyz field 3 kdb 我编写了一个原子 标
  • Android Adapter 多个getView

    我已经阅读了多次调用 getView 的问题和所有答案 但是 我没有找到解决我的问题的方法 我有一个列表 其中行有两种状态 已读或未读 好吧 我希望第一次看到的项目有不同的颜色 当我滚动列表时 它们将颜色更改为 已读状态 为了做到这一点 在
  • MongoDB - 为什么 _id 索引不会在重复条目上抛出错误?

    我对 NoSQL 数据库完全陌生 目前正在使用 MongoDB 我试图理解为什么默认 id索引不会抛出错误 当upserting a duplicate id文档 正如文档中所述 id默认是唯一索引 虽然这里没有显示独特的标志 gt db
  • Symfony 2.6 - 按名称渲染单个选择字段(单选框、复选框)

    如何在 Symfony 2 6 的 Twig 中渲染单个字段 单选框 复选框输入字段 假设我有一个简单的表格 class TransportType extends AbstractType public function buildFor
  • printf什么时候打印失败?

    C 中的 printf 函数并不总是在屏幕上打印输出 例如 如果您忘记将 n 放在字符串末尾 则您正在 printfing 有时您不会得到 o p printf 不打印时是否还有其他一些情况 我记得有人说过这样的条件有7个 你们可以帮忙吗
  • 从内连接创建 mysql 表

    我正在尝试从另外两个表之间的内部联接创建一个 mysql 表 我正在处理某人创建的数据库 其中包含以下表格 sitematrix sites sitematrix databases 它们通过另一个名为的表 我不知道为什么不使用外键 相关s
  • 自定义 jQuery 不适用于 Wordpress Ninja Forms 插件

    当我想添加影响表单的自定义 jQuery 代码时 我遇到了一些问题 例如 当有人单击一个输入或单选按钮时 另一个输入或元素将被隐藏或显示 我试图得到如下结果console log trigger 当点击或其他东西但开发中没有任何内容时 控制
  • LDAPSEARCH 转换为表格格式

    有没有办法执行 LDAP 搜索并将结果保存为表格格式 例如 csv 干杯 乔治 您可以使用优秀的铣床工具 mlr https miller readthedocs io en latest 最后一点 echo output sed s g
  • 从 C# 函数运行 git 命令

    当我的 C 代码检测到跟踪文件中的更改时 它如何运行 git 命令 我正在为此目的编写一个 VisualStudio C 控制台项目 我是 NET 环境的新手 目前正在致力于将自动化 GIT 提交集成到文件夹中 我需要自动提交对已知文件夹的
  • 在测试过程中如何将 Facebook 应用限制为少数人使用?

    我了解测试帐户 但在测试期间 我只想允许我的朋友访问 然后是朋友的朋友 最后只允许凯文 培根和他的朋友访问 那可能会很糟糕 不是吗 该应用程序将被列出 有办法阻止列出吗 我不认识的人可能会尝试它并收到 抱歉 这是开发中的消息 我想他们会很生
  • Lambda、本地类型和全局命名空间

    这个最小程序 template
  • 如何从 UISearchBarDisplayController 结果转至detailViewController

    因此 使用故事板 您可以创建从 UITableViewCell 从第一个 tableViewController 到DetailViewController 的 Segue 然而 并不太复杂 当将 UISearchBarDisplayCon
  • 在棕地应用程序中实施单元测试的首要任务是什么?

    你首先重构你的SQL吗 你的建筑 或者你的代码库 你会改变语言吗 你会抛弃一切并从头开始吗 不重构 我正在向大型遗留意大利面条代码库添加单元测试 我的方法是 当被要求解决问题时 我尝试围绕与我当前任务相关的代码库部分创建一个新的包装器 这个
  • JqG​​rid:显示列内 HTML 元素的文本

    我已经使用 gridComplete 来显示 HTML 按钮 但它显示 HTML 文本而不是按钮 并将编码的 HTML 作为标题 这看起来不太好 请帮助我删除或更改标题 工具提示 并显示按钮 输出 当我检查这个单元格时 我可以在 chrom
  • Javascript 事件循环说明

    我不断看到 Javascript 事件循环 即 浏览器 JS 运行时事件循环 的解释 这些解释对我来说似乎不太合理 我希望有人能够提供一些权威的澄清 我的基本假设是 JS 事件循环就像我们几十年来在 UI 框架中使用的事件循环一样 如下所示