什么是setTimeout(function(){// dostuff},0);实际上该怎么办?

时间:2008-11-11 23:25:46

标签: javascript performance

这种模式:

setTimeout(function(){
             // do stuff
}, 0);

实际上是从循环中将控制权返回给UI?你应该什么时候使用它?它在所有浏览器中都能同样有效吗?

5 个答案:

答案 0 :(得分:4)

http://blog.thinkature.com/index.php/2006/11/26/escaping-the-javascript-call-stack-with-settimeout/

那里有一些很好的信息。基本上,你是正确的,它适用于几乎所有的浏览器。很酷的技巧。

您可能希望在帖子的作者给出的示例中使用它,以及在执行代码之前需要将执行返回到调用函数的实例。显然,Javascript不是多线程的,但这很接近。

希望这会有所帮助:)

答案 1 :(得分:4)

它以异步方式运行代码(不是并行运行)。延迟通常改为最小10ms,但这并不重要。

此技巧的主要用途是避免限制调用堆栈深度。如果你冒险达到极限(走深树结构并计划在叶子上做很多工作),你可以使用超时来启动一个新的空调用堆栈。

您也可以使用它来避免阻止当前线程。例如,如果您不希望<script>元素延迟加载页面:

<script>compute_last_pi_digit()</script> <!-- blocking -->

<script>setTimeout(compute_last_pi_digit,0)</script> <!-- non-blocking -->

答案 2 :(得分:1)

一旦线程上的任何其他挂起指令完成,它将异步调用该函数(如果没有则立即执行)并将控制权返回给UI。您应该在事件处理程序中使用它,您不希望在事件仍然被传播*时运行代码。它适用于所有浏览器。

答案 3 :(得分:0)

将其视为过去设置中断向量。

它不会并行处理该代码,而是在事件(在这种情况下,计时器结束)被触发时跳转并执行它。

答案 4 :(得分:0)

我发现当从同一个动作触发多个事件处理程序时,它对于避免竞争条件非常有用。