jQuery触发器功能是否保证是同步的

Kyl*_*yle 18 javascript concurrency jquery javascript-events

触发功能似乎是同步的.也就是说,所有绑定函数似乎是按顺序,同步执行(调用函数可以异步执行某些操作,但这不是问题).

这适用于自定义和非自定义(点击,悬停等)事件吗?是否有任何事件,javascript的单线程保证不成立?

如果为true,是否可以更改行为以异步方式执行它们而不将超时插入每个绑定函数?

这是一个演示问题的示例:

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);
Run Code Online (Sandbox Code Playgroud)

更新 请参阅:JavaScript是否保证是单线程的? 由于javascript的单线程特性,自定义事件保证是同步的.由于浏览器不一致,某些内置事件类型可能不同步.

Bee*_*oot 17

我自己上面提供了一个轻微修改的评论集 - Beetroot-Beetroot:

  • 活动没有持续时间; 提供一个处理程序,它们会导致一个线程启动.因此,事件本身既不是同步也不是异步.事件激发的线程将始终是同步的,但可能会启动一个或多个异步进程.

  • .trigger()无论可能在触发事件处理程序中启动的任何异步进程如何,调用始终是同步的.当触发的处理程序返回时,执行将返回到.trigger(...)之后的语句.即,.trigger()是一个美化的函数调用.

  • 在javascript中,当使用setTimeout()启动任何内容之前,当前线程绝对保证运行完成,即使超时持续时间为0.与ajax相同 - 例如,调用的线程$.ajax(...)保证在之前运行完成即使服务器要立即响应,任何成功/错误/完成处理程序也会开始.

  • 单线程是ECMA-262(javascript)固有的,即.在任何时候,最多可以运行一个线程.

附加要点:

javascript的加入答案保证是单线程的吗?是基于一个错误的前提.没有证据表明javascript不是单线程的.@KrisGiesing的评论揭穿了误解.