0

如果我做:

setTimeout(function(){ alert('antani'); },400);
    setTimeout(function(){ alert('supercazzola'); },400);

为什么这个脚本会在这两个超时之间生成队列?

他们不应该同时发出警报吗?

正如我所看到的测试它,首先,第一个警报被执行,然后是第二个。

4

2 回答 2

1

背景

JavaScript 只有一个运行解释器的线程。这意味着永远不会同时处理事件。当您设置超时时,您实际上订阅了浏览器的一些内部事件,每次浏览器处于空闲模式时都会触发(当不忙于渲染、解析或执行某些脚本等时)。此事件的处理程序以及它们被安排的时间根据setTimeout脚本中出现的顺序发布到队列中。每次触发此内部事件时,浏览器都会检查每个处理程序并决定是执行并将其从队列中删除还是跳过它。

同时

当您以相同的估计时间一个接一个地安排任务时

setTimeout(function(){ $('.element').hide(); },400);
setTimeout(function(){ $('.element').show(); },400);

.element首先隐藏然后显示。请注意,这并不意味着浏览器将.element在隐藏后呈现更改。大多数浏览器只会在脚本完成执行后呈现。

不同的时间

当您安排具有不同估计时间的任务时:

setTimeout(function(){ $('.element').hide(); },401);
setTimeout(function(){ $('.element').show(); },400);

结果可能无法预测。可能会出现以下情况:

  • 多于或等于400和少于401毫秒过去了,浏览器开始处理事件处理程序。在这种情况下.element,将首先显示然后隐藏。请注意,可能还有其他setTimeout计划在400毫秒后执行,它们将在 hide 之前运行.element

  • 401浏览器在第一次开始处理事件处理程序之前忙了几毫秒或更长时间。在这种情况下,最有可能(取决于浏览器实现).element将首先隐藏然后显示,尽管根据估计时间它应该反之亦然!

关于您的问题:设置相同时间的超时或某个正增量是否相同,答案是否定的。这是不一样的,当您使用 delta 设置超时时,总是有可能在它们之间处理另一个事件或超时。

于 2013-04-24T11:15:47.243 回答
1

请阅读:http ://ejohn.org/blog/how-javascript-timers-work/

这是一个类似的例子:

function a(){
   var num = 5;
   console.log( ++num );
   setTimeout( a, 100 );
};
setTimeout(a,2000);

按年代顺序:

您正在定义函数 a 而不调用它

您正在安排 a 在两秒后调用: setTimeout(a,2000)

它被称为

当它被调用时,它会安排自己在 100 毫秒后调用

您的代码基本上会休眠 2 秒,然后执行 100 毫秒暂停 [*]。

但是,根据您的上下文判断,您在问以下情况下的优先级是什么:

setTimeout(a, 2000);
setTimeout(b, 100);

好吧,很可能首先调用 b (假设第一行和第二行之间没有不可预测的暂停,例如由于整体操作系统性能问题)。

如果您使用相同的超时:

setTimeout(a, 100);
setTimeout(b, 100);

a 很可能首先被调用。但是我不认为这是有保证的,并且取决于 JS 引擎(它是否对即将发生的事件使用严格的 FIFO 列表,内部时钟分辨率是多少等)

于 2013-04-24T10:38:51.117 回答