javascript - 事件处理程序如何在 javascript 内部执行?

标签 javascript asynchronous message-queue event-loop

我理解javascript是单线程的,任何异步任务只有在当前栈为空后才会执行。回调、setTimeout、promises 仅在当前函数完成后执行。

我想知道当我执行某些事件时,浏览器如何调用我的事件处理函数。

当我们说我们正在注册一个事件时,我们在哪里注册它? (消息队列,作业队列)?它保存在内存中的什么位置,浏览器如何知道某个事件已经发生?

事件与操作系统调用有关吗?

我看过philip roberts video我了解事件循环的功能。

我想了解 javascript 的内部结构。

最佳答案

When we say we are registering an event, where are we registering it? Where does it get saved in memory?

处理函数安装在您正在收听的资源上。对于 DOM 事件,它是浏览器用于显示文档的 DOM 对象,对于 promise 它是一个 JS 对象,对于计时器,有一个内部计时器对象(与 DOM 相关,因为计时器是在 HTML 中和每个窗口中定义的)。

(message queue, job queue)?

不,当一个事件处理程序被注册时那些保持空。只有当事件实际发生时,需要运行的处理程序才会被放入队列。

How does the browser know that some event has occurred? Are events related to operating systems call?

是的,最终事件来自操作系统,无论是网络数据包到达、超时发生还是浏览器窗口上的点击。 (只有极少数事件是从浏览器机器本身内部触发的)。浏览器然后检查哪些资源受到系统事件的影响(例如,单击了哪个 DOM 元素),然后触发相应的事件,以便它可以根据需要安排任何处理程序。

关于javascript - 事件处理程序如何在 javascript 内部执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53999168/

相关文章:

javascript - Mapbox-GL setStyle 移除图层

c++ - 如何在 "native c++"环境中使用 WinRT IAsyncOperation* 对象

c# - 如何在我的 C# 应用程序中限制来自 ActiveMQ 的消息量?

python : efficiency concerns in parallel async calls to fetch data from web services

validation - 如何在 Angular4 中实现自定义异步验证器

java - 如何将消息备份从一台 HornetQ 服务器复制到另一台服务器?

msmq - 寻找能够提供完全 ACID 和什么都没有的消息总线实现

javascript - xhtml 内 javascript 的 Eclipse 格式删除//<![CDATA[ 标签

javascript - 如何在javascript中的数组内部循环?

javascript - 如何修复在使用以 Sprite 为中心的camera.position设置时朝鼠标移动的 Sprite 随机振动的问题?