2015-11-18 19 views
0

以下示例結構:

function b(){ 
    $('#a').on('blur', function(){ 
    console.log('blur'); 
    }); 
} 
function c(){ 
    $('#a').trigger('blur'); 

    //pseudo: e.g. reading value from #a 
} 
b(); 
c(); 

我現在的問題是,將呼叫觸發同步執行回調,然後跳回功能「C」疊加麼?或者是否可能在棧c中的「觸發器」之後的某些代碼可以在回調(異步操作)之前執行?

+1

我不完全確定你在問什麼,但所有的事件處理程序都是從它們被觸發的地方同步的,你可以在這裏看到:http://jsfiddle.net/5qczrvc5/。你的例子中沒有任何回調是異步的。 –

+0

可能的重複:http://stackoverflow.com/questions/2035645/when-is-javascript-synchronous –

+0

好吧,所以在我調用觸發器函數後,所有處理程序都會同步調用,並'阻止'c函數的其餘指令堆棧直到所有處理程序返回? – rgruenke

回答

1

Javascript是單線程的,這意味着您的代碼按順序執行 - 不必介意將調用傳遞給事件處理程序。

處理程序及其調用不是執行異步的東西。這是事件本身,因爲它們通常受到不可預知的外部因素的影響,如用戶交互或網絡延遲。在這裏,事件是可預測的同步觸發的,所以執行的順序實際上是一成不變的。

這對多線程來說是一個不同的故事,例如,如果網絡工作者參與。但事實並非如此。

+0

好的,謝謝,我知道它是單線程的,但是我記得堆棧指令是可交換的,所以當一些函數堆棧還沒有完成的時候一些intstructions可以進來(事件循環和它可以放置回調的任務隊列)。就我所知,這些操作是異步的(例如,可以用setTimeout來設置回調)。我錯了嗎? – rgruenke

+0

看起來像一個人不能自己創建任何併發(如描述)。 – rgruenke

+0

好吧,我現在可以看到混亂的來源:)在JS運行時沒有魔術堆棧重新排序 - 否則它將不再是堆棧。你似乎懷疑'trigger'調用本身使得異步,就好像它會像'setTimeout()'調用一樣執行。然後,回調(事件處理程序)將在任務隊列中結束,一旦堆棧被清除,處理將被處理。結果,回調將最後執行。而且這總是如此,而不是隨機的。 - 但這不會發生什麼事情,這觸發了'trigger'被作爲堆棧的一部分進行處理。 – hashchange