2012-03-28 48 views
2

(具体来说,我使用骨干模型事件)Javascript事件处理程序是否阻止?

有人可以帮助我了解javascript事件的工作原理吗?以下是不工作我预期的方式,它给我留下了困惑:

骨干,我进行了更改我的模型,随后马上我运行一些代码:在

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事件的所有事件处理程序完成射击。 (我通过在事件上附加了一个耗时的事件处理程序进行检查)

这是预期的行为吗?

回答

4

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

+0

我的理解是,事件处理程序与“触发器”同步运行,但是您可以在事件处理函数中获得正常的语义 - 即 - 它可以在函数调用边界处产生另一个等待事件处理程序 - 调用你的事件处理程序。那是不正确的? – 2012-03-28 00:55:18

+0

哇...不知道为什么,但这只是完全通过我的曲线...我一直认为这东西都是非阻塞的!感谢js 101 – uglymunky 2012-03-28 01:03:39

+0

的教训,至少,jQuery指定处理程序按照它们绑定的顺序执行。那对我意味着没有屈服。我的理解是,基本的JavaScript也是这样工作的 - 绑定事件本质上就是一个接一个地执行的方法队列。真的没有屈服的概念。 – bhamlin 2012-03-28 01:07:00

1

JavaScript块中的所有内容仅取决于何时。如果你设置了其他函数的处理函数,为处理函数触发事件并运行其他函数,它将按照我列举的顺序执行。事件处理程序的要点是在触发某些事物时执行代码,但它永远不会是异步的。所以你的答案是,这是预期的行为。为了理解JavaScript的天堂和地狱,只需搜索Crockford关于javascript的演讲。

希望这会有所帮助。