JavaScript 中的 DOM 事件处理程序如何由事件循环处理?

Coo*_*ter 4 javascript dom dom-events

我对浏览器如何处理 JavaScript 事件有点困惑。

假设我有两个事件处理程序附加到按钮 A 和 B。这两个事件处理程序花费完全相同的时间来完成。如果我先单击按钮 A,然后单击按钮 B,那么按钮 A 的事件处理程序是否总是首先执行(因为事件循环是一个 FIFO 队列),但它们何时完成是完全不可预测的?如果是这样,实际上是什么决定了这个顺序?

Ben*_*aum 5

是的。事件处理程序的执行顺序是有保证的,并且实际上它们不会重叠。

这就是事件循环作为并发模型的美妙之处。大多数时候(尽管并非总是如此),您不必考虑诸如死锁、活锁和竞争条件之类的线程问题。

执行顺序很简单,浏览器中的 JavaScript大部分时间都是单线程的,实际上您不必担心事物的执行顺序。

然而,保证鼠标事件的顺序这一事实与 JavaScript 几乎没有任何关系这不是 JavaScript 语言的一部分,而是DOM API的一部分,DOM(文档对象模型)是 JavaScript 与浏览器和您编写的 HTML 交互的方式。

称为主机对象的东西在 JavaScript 规范中被定义为浏览器中 JS 所使用的外部对象,并且在这种情况下它们的行为是在 DOM API 中指定的。

DOM 事件的注册顺序是否得到保证不是 JavaScript 的一部分,而是该 API 的一部分。更具体地说,它是在这里定义的。所以对于你的问题:是的,事件执行的顺序是确定的,除了控制键(如(control alt delete))之外,它可能会弄乱评估的顺序。