我对浏览器如何处理JavaScript事件感到有些困惑。
假设我有两个事件处理程序附加到按钮A和B.两个事件处理程序完全相同的时间完成。如果我先单击按钮A然后单击按钮B,那么按钮A的事件处理程序是否始终首先执行(因为事件循环是FIFO队列),但是当它们完成是完全不可预测的?如果是这样,实际上是什么决定了这个顺序?
答案 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的响应可能会更晚。