2015-11-18 21 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