26

设置间隔()

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

尽管()

只要测试条件评估为真,就创建一个执行指定语句的循环。在执行语句之前评估条件。

如果我使用while(true)执行特定语句,我的浏览器要么崩溃(Firefox),滞后(Opera),或者该语句不会被执行(Chrome),但如果我使用0 秒setInterval()的固定时间,一切正常,即使它只有 0 秒,并且在逻辑上不能快于 0 秒,但为什么会发生这种情况?while(true)

while()示例:

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

setInterval()示例:

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

5 回答 5

23

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

于 2013-02-12T19:50:36.693 回答
15
  • while(1)生成一个无限循环,也就是说,JavaScript 将永远运行并且永远不会将控制权交还给浏览器,因此它会冻结,因为它无法再进行任何其他操作(直到脚本被杀死)。

  • setTimeout(func, 0)从某种意义上说,它的行为有所不同,在它执行之后,控制权被交还给浏览器,然后浏览器可以决定之后要做什么。设置 0mssetTimeout 并不能保证JavaScript 代码在停止后直接运行。使用 0ms 参数,您只需告诉浏览器您希望代码在它停止后直接运行,但浏览器可以在实际执行之前完全自由地执行其他操作。

于 2013-02-12T19:53:44.240 回答
13

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

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

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

编辑(再次):你为什么要永远循环?如果您正在投票(我能想到的唯一原因),请不要这样做。几乎总是有更好的方法,尤其是在 JS 中。函数式方法是定义事件发生时要执行的函数(您正在轮询的事物),然后将该函数附加到事件(如何执行此操作取决于事件)。

于 2013-02-12T19:51:51.640 回答
5

while(true) 将阻止任何执行,直到条件循环完成,我们已经知道这永远不会发生。(铬合金)

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

于 2013-02-12T19:54:45.377 回答
1

您是否有特定的理由使用永无止境的循环,甚至在每一步都操作 DOM?

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

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

在 for 的情况下setInterval,它与循环有很大的不同while,实际上,将其称为 a 更合适function repeater。它在给定时间过去后重复给定功能。因此,即使时间为 0,它也有一个检查if the waiting time has passed now, and should the next repeat be run.

因此,您可能会认为 while 循环比 0 秒延迟更即时。

于 2013-02-12T19:58:27.603 回答