触发函数似乎是同步的。也就是说,所有绑定(bind)函数似乎都是按顺序同步执行的(被调用的函数可能会异步执行某些操作,但这不是问题所在)。
对于自定义和非自定义(单击、悬停等)事件来说,情况是否如此?是否存在 Javascript 的单线程保证不成立的情况?
如果是 true,是否可以更改行为以异步执行它们,而不在每个绑定(bind)函数中插入超时?
这是一个演示问题的示例:
var ele = $('#blah');
// Example of the bound function doing something synchronously
ele.bind('customEvent.sync', function() {
// Do something synchronously
window.foo = 'foo';
});
// Example of the bound function doing something asynchronously
ele.bind('customEvent.async', function() {
window.setTimeout(function() {
// Do something asynchronously
window.bar = 'bar';
}, 0);
});
// Trigger both events
ele.trigger('customEvent');
// If trigger is guaranteed to be synchronous this should alert 'foo:undefined' or possibly 'foo:bar' depending on whether the asych function was called first
// If trigger is NOT synchronous 'undefined:undefined', 'foo:undefined', 'undefined:bar', or 'foo:bar' could be alerted
alert(window.foo + ':' + window.bar);
更新 请参阅:Is JavaScript guaranteed to be single-threaded? 由于 Javascript 的单线程特性,自定义事件保证是同步的。由于浏览器不一致,某些内置事件类型可能不同步。
最佳答案
我自己在上面提供的评论选集 - Beetroot-Beetroot :
事件没有持续时间;如果附加了一个处理程序,它们就会导致一个线程启动。因此,事件本身既不能是同步的,也不能是异步的。事件激发的线程始终是同步的,但可能会启动一个或多个异步进程。
对
.trigger()
的调用始终是同步的,无论触发事件处理程序中是否启动任何异步进程。当触发的处理程序返回时,执行将恢复到 .trigger(...) 之后的语句。即,.trigger() 是一个美化的函数调用。在 javascript 中,当前线程绝对保证在 setTimeout() 执行的任何操作开始之前运行完成,即使超时持续时间为 0。与 ajax 相同 - 一个线程调用
$.ajax(...)
保证在任何成功/错误/完成处理程序开始之前运行完成,即使服务器立即响应也是如此。单线程是 ECMA-262 (javascript) 固有的,即。在任何时刻,最多可以运行一个线程。
补充一点:
接受的答案 Is javascript guaranteed to be single-threaded?是基于一个错误的前提。没有证据表明 javascript 不是单线程的。 @KrisGiesing 的评论揭穿了这一误解。
关于javascript - jQuery触发函数是否保证同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14017013/