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

Ali*_*sam 24 html javascript

的setInterval()

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

而()

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

如果我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>
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

Tra*_*s J 20

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


Dav*_*lin 12

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

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

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

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


fre*_*oma 12

  • while(1)生成一个无限循环,也就是说,JavaScript将永远运行,并且永远不会将控制权交还给浏览器,因此它会冻结,因为它无法再发送任何其他东西(直到脚本被杀死).

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


Adr*_*zar 5

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

setInterval告诉环境每x毫秒执行一次任意代码,它不会阻塞你的浏览器,因为"scheduler"仍然有控件.