2012-03-28 47 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的演講。

希望這會有所幫助。