这种模式:
setTimeout(function(){
// do stuff
}, 0);
实际上是从循环中将控制权返回给UI?你应该什么时候使用它?它在所有浏览器中都能同样有效吗?
答案 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)
我发现当从同一个动作触发多个事件处理程序时,它对于避免竞争条件非常有用。