18

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

对于自定义和非自定义(单击、悬停等)事件是否如此?是否有任何 Javascript 的单线程保证不成立的事件?

如果是这样,是否可以更改行为以异步执行它们而不在每个绑定函数中插入超时?

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

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);

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

4

1 回答 1

18

我自己在上面提供的经过轻微修改的评论选集 - Beetroot-Beetroot:

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

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

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

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

附加点:

接受的答案是否保证 javascript 是单线程的?是基于一个错误的前提。没有证据表明 javascript 不是单线程的。@KrisGiesing 的评论揭穿了这种误解。

于 2012-12-24T06:26:12.440 回答