while(true)vs setInterval(function(),0)

时间:2013-02-12 19:47:08

标签: javascript html

的setInterval()

  

重复调用函数或执行代码段,每次调用该函数之间都会有固定的时间延迟。

而()

  

只要测试条件的计算结果为true,就会创建一个执行指定语句的循环。之前评估该条件   执行声明。

如果我使用while(true)执行特定声明,我的浏览器会崩溃( Firefox ),滞后( Opera ),或者声明不会被执行( Chrome ),但如果我使用固定时间为 0秒setInterval(),一切都运行正常,即使只有0秒,{ {1}}逻辑上不能超过0秒,但为什么会发生这种情况?

while()示例:

while(true)

setInterval()示例:

<!DOCTYPE html>
<html>
    <body>
        <div id="counter"></div>
        <script>
            var i = 0;
            while (true)
            {
                document.getElementById("counter").innerHTML += i++; 
            }
        </script>
    </body>
</html>

5 个答案:

答案 0 :(得分:19)

存在很大的差异,涉及锁定。第一种方法是while循环将锁定用户的cpu,因为它会在不停止的情况下永久运行并占用100%的处理器。 setInterval实际上具有隐含的最小量,并且取决于浏览器。我相信它大概是10毫秒。所以,你的setInterval实际上只运行了一毫秒左右,每隔10毫秒进行一次简单的更新。这在处理器上很苛刻,但不需要100%的处理器,并且可以通过操作系统的任务管理来缓解。

答案 1 :(得分:12)

浏览器中的Javascript是单线程事件驱动。没有两件事同时运行,事件循环是王道。如果你的JS从不放弃对单个线程的控制(通过结束一个函数),那么没有别的东西可以使用该线程。同一个线程处理JS和DOM,因此如果你的JS正在占用线程,用户甚至无法滚动或点击任何东西。

setInterval(或实际上setTimeout)延迟为0(毫秒,而不是秒)只意味着在给定的延迟后将此函数添加到事件队列中,不能保证函数将是在那个确切的时间执行。

编辑:实际上,Web工作者可以在主浏览器线程的同时运行JS,但是他们没有看到任何相同的内存/无法访问DOM,所以上面的点/假设仍然存在,如果你想进入Web工作者,你需要对JS /函数式编程有一个很好的理解。

编辑(再次):你为什么要永远循环?如果你是民意调查(只有我能想到的原因),请不要这样做。几乎总有一种更好的方式,特别是在JS中。功能方式是定义事件发生时要执行的功能(您要轮询的内容),然后将该功能附加到事件中(如何执行此操作取决于事件)。

答案 2 :(得分:11)

  • while(1)会产生一个无限循环,也就是说,JavaScript只会永远运行而永远不会将控制权交还给浏览器,因此它无法冻结,因为它无法其他任何事情(直到剧本被杀)。

  • setTimeout(func, 0)在执行之后的行为方式不同,控制权将返回给浏览器,然后浏览器可以决定接下来要做什么。在setTimeout 中设置0ms并不能保证 JavaScript代码在停止后直接运行。使用0ms参数,您只需告诉浏览器您希望代码在停止后直接运行,但浏览器可以在实际执行之前完全执行其他操作。

答案 3 :(得分:5)

while(true)将阻止任何执行,直到条件循环结束,我们已经知道它永远不会发生。 (镀铬)

setInterval告诉环境每隔x毫秒执行一次任意代码,它不会阻塞你的浏览器,因为“调度程序”仍有控件。

答案 4 :(得分:1)

你是否有使用永无止境循环的特殊原因,甚至每一步都操纵DOM?

如果使用while循环,它最有可能完全锁定浏览器和客户端,如果没有以某种方式终止,也会导致CPU过载。

循环while尝试在最可能的最小微秒内完成它的工作。所以它甚至可能尝试在可能的秒内执行一百万步,甚至可能更多,在这种情况下它取决于客户端。但是,在这样的速度更新时,DOM是不可能的。

对于setInterval,它与while循环完全不同,事实上,将其称为function repeater更合适。在给定时间过后,它重复给定的函数。因此,即使时间为0,它也会检查if the waiting time has passed now, and should the next repeat be run

所以你可以考虑while循环比0秒延迟更快。

相关问题