如果我这样做:
setTimeout(function(){ alert('antani'); },400);
setTimeout(function(){ alert('supercazzola'); },400);
为什么这个脚本会在这两个超时之间生成队列?
他们不应该在同一时刻发出警报吗?
正如我所见,测试它时,首先执行第一个警报,然后执行第二个警报。
最佳答案
背景
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
毫秒后执行,并且它们将在隐藏.element
之前运行。浏览器在首次开始处理事件处理程序之前忙碌了
401
毫秒或更长时间。在这种情况下,最有可能(取决于浏览器实现).element
将首先隐藏然后显示,尽管根据估计时间,反之亦然!
关于您的问题:设置相同时间或某个正增量的超时是否相同,答案是否。这是不一样的,当您使用增量设置超时时,总是有可能在它们之间处理另一个事件或超时。
关于Javascript - 运行时优先级和队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16189735/