JavaScript事件处理程序会阻塞吗?

3

我是一名有用的助手,可以为您翻译文本。

具体而言,我正在使用Backbone模型事件。

有人能帮我理解JavaScript事件是如何工作的吗?以下内容并没有按照我预期的方式工作,这让我感到困惑:

在Backbone中,我对我的模型进行了更改,并立即运行了一些代码:

var myVar;
myModel.set('someAttr', true);  // Change my model
myVar = executeSomeFunc();  // Now run some code

然后在我的代码库的其他地方,我监听事件并处理它(在我的情况下,我正在使用集合包装此模型):

myCollection.on('change:someAttr', changeHandler);  // Listen for the event

我发现myVar = executeSomeFunc()操作并不会在所有change:someAttr事件处理完毕之前执行。(我通过将一个耗时的事件处理程序附加到事件上进行了检查)
这是预期行为吗?
2个回答

5

是的,JavaScript不支持多线程。当您触发事件时,所有的事件处理程序都会立即执行。


我的理解是事件处理程序与“触发器”同步运行,但在事件处理程序函数内部可以获得正常的语义-也就是说,在事件处理程序内部的函数调用边界处,它可以让出对另一个等待事件处理程序的控制权。这个理解有误吗? - David-SkyMesh
哇...不知道为什么,但这完全让我措手不及...我一直以为这些东西都是非阻塞的!感谢你在js 101中的教诲。 - gxc
jQuery至少指定处理程序按绑定顺序执行。这意味着对我来说没有yielding。我理解基本的javascript也是这样工作的 - 绑定事件本质上只是一个方法队列,一个接一个地执行。实际上并没有yielding的概念。 - bhamlin
3
我错了!(唯一让步的方法是使用setTimeout)。至于事件处理程序的同步性,这篇文章非常详细地解释了它(答案似乎是“视情况而定”):http://javascript.info/tutorial/events-and-timing-depth - David-SkyMesh

1

JavaScript 中的所有内容都是块级作用域,只是取决于何时。如果您设置了处理程序和其他函数,触发处理程序的事件并运行其他函数,它将按照我枚举它们的确切顺序执行。事件处理程序的重点是在触发某些内容时执行代码,但它永远不会是异步的。因此,对于您来说,答案是肯定的,这是预期的行为。要了解 JavaScript 的优缺点,请搜索 Crockford 关于 JavaScript 的演讲。

希望这可以帮助您。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接