JavaScript 有事件表吗?

问题描述 投票:0回答:1

我在 Medium 上读到一篇文章,其中说 “JavaScript 有一个事件表,用于跟踪可能在一段时间间隔后或在解决某些 API 请求后异步执行的所有事件”。这是我第一次听说它,所以我决定研究一下,但谷歌搜索除了那篇文章之外没有返回任何结果。 我还在网上找到了以下信息“JavaScript没有明确的“事件表”数据结构来存储延迟事件。相反,事件和异步任务是通过事件队列和定时器函数(如setTimeout和setInterval)来管理的”。 其中哪一项是正确的? 这是文章

javascript asynchronous callstack event-loop
1个回答
0
投票

直到今天我才听说过“事件表”这个词。不,JavaScript 语言确实没有这样的东西,但它作为一种可能存在于某些运行时的结构确实有意义。

一个事件表,用于跟踪将异步执行的所有事件

这是完全错误的,或者充其量是非常草率的术语:

  • 事件不是“执行”的,而是“激发”或“分派”的。执行的是任务或事件处理程序或回调函数
  • 事件对象在发生时创建,它不存储在表中。这样的表中可以存储的是事件注册或事件处理程序。

但是,到目前为止,我遇到的所有实现(浏览器和服务器端运行时)都没有一个“跟踪所有事件”的全局“事件表”。相反,事件处理程序通常存储在它们注册的对象中。计时器回调存储在

setTimeout
创建的计时器对象中。 onload 回调存储在
fetch
创建的网络请求对象中。 onclick 回调存储在调用
addEventListener('click')
的 DOM 节点中。

无可否认,运行时必须保留当前活动的这些计时器对象、这些网络请求对象、这些文档的一些全局列表(队列?):

  • 作为GC根,防止它们被垃圾收集
  • 作为从操作系统接收的事件的目标,例如对于网络 API
  • 作为运行时本身生成的事件的组织单位,例如对于计时器 API
© www.soinside.com 2019 - 2024. All rights reserved.