gpt4 book ai didi

javascript - jQuery触发函数是否保证同步

转载 作者:行者123 更新时间:2023-12-03 21:51:52 26 4
gpt4 key购买 nike

触发函数似乎是同步的。也就是说,所有绑定(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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com