监听JS中的事件

问题描述

我听说过很多关于JS是如何单线程和异步的,并且我知道事件循环和回调队列。

我不了解的是,单线程语言如何在执行其他代码时监听事件并将事件处理程序添加到队列中?

例如,在长循环运行时单击按钮,即使线程被占用,也会将其回调添加到队列中。

谢谢

解决方法

答案是操作系统(或Javascript,用于代码生成的事件)将事件发送到浏览器中的JS,并将这些事件放在队列中进行处理。 Javascript的一个线程将事件从队列中移出并对其进行处理,直到没有剩余事件为止,此时它等待下一个事件的到来。有关更多信息,请阅读消息队列:https://en.wikipedia.org/wiki/Message_queue

,

简单地说,浏览器不是用javascript编写的,而javascript不能处理事件。

UI事件首先由操作系统发送给浏览器,然后浏览器将处理这些消息,并将任务排队以构建DOM事件并将其分派,最终可能触发相关的JavaScript回调。

仅最后一部分涉及JavaScript。您可以很好地拥有一个不实现JavaScript但仍然可以处理某些UI事件(例如CSS指针事件,HTML输入,媒体控件等)的用户代理(UA)

此处理方式取决于UA。

很长一段时间,在您提供的确切示例中,浏览器无法处理事件循环繁忙时触发的点击(IIRC最新的IE仍然无法执行)。只是在现代浏览器中,他们才开始使用multi-process architectures,它们能够通过共享不同的消息队列进行通信(Inter-Process Communication)。

因此,即使确实执行事件循环各种任务的“主”渲染器线程很忙(例如执行js),其他进程仍可以并行运行,并将新任务排入适当的任务队列。
当渲染器线程完成其长任务时,新任务已排队并且可以对其进行处理。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...