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

时间:2013-09-16 06:28:29

标签: javascript

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

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

3 个答案:

答案 0 :(得分:3)

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

这是事件循环作为并发模型的美妙之处。您不必考虑线程问题,例如死锁,活锁和竞争条件most of the time(尽管并非总是如此)。

执行顺序很简单,浏览器中的JavaScript是单线程的most,实际上你不必担心事情的执行顺序。

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

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

是否注册了订单DOM事件是不是JavaScript的一部分,而是该API的一部分。更具体地说,它被定义为right here。所以对你的问题:是的,事件执行的顺序是确定的,除了控制键(如(控制alt删除)),这可能会导致评估顺序混乱。

答案 1 :(得分:2)

Javascript引擎是单线程的。所有事件处理程序都按顺序发生;将调用A的单击处理程序,并在B的处理程序启动之前完成。您可以在一个处理程序中通过sleep()ing查看此内容,并验证第二个处理程序在第一个处理程序完成之前不会启动。

请注意,setTimeout对此测试无效,因为它实际上会注册一个函数,以便稍后回调引擎。 setTimeout立即返回。

This fiddle应该证明这种行为。

答案 2 :(得分:-1)

当javascript执行时,命令确实在FIFO中。但是,处理程序可能需要不同的时间来向您发送结果。在这种情况下,处理程序B的响应可能会提前返回,处理程序A的响应可能会更晚。