JS - 这个循环是如何导致浏览器崩溃的?

3

我在微软Edge浏览器的JS控制台中编写了我的第一段JavaScript代码:

var times = 10;
for(var i = 0; i < times; times++)
{
    console.log(times);
}

很快,它会导致浏览器变得无响应并崩溃。

为什么?怎么会这样?

可以肯定的是,这是一个无限循环。 但是,存储 times 的值并不断递增如何导致崩溃呢? 持有几个变量的值真的很费事吗?

毕竟,电脑里还有一百万个其他计算在不断进行,例如时间和系统的GUI功能。它们不会引起崩溃。

我肯定缺少有关实际内部工作原理的某些信息,这才导致了这种崩溃。

综上所述问题: 以上循环如何使浏览器崩溃?

需要解释其中的内部机制。


3
无限循环会阻塞线程上的所有其他执行。因此,根据你使用的运行方式和它如何处理,浏览器或选项卡可能会崩溃。 - VLAZ
为什么你在循环的末尾加上了 times? 添加 { i } - Khant
1
...并且console.log(i),除非你有一个非常具体的原因来创建这样一个无限循环。 - Filburt
1
简单回答:因为Javascript是单线程的,意味着在循环期间,除非有其他操作终止它,否则没有其他事情可以发生。 - Lennholm
@Lennholm 请考虑将这个评论作为答案,因为我愿意接受这个答案,并且在此页面上没有其他令人满意的答案。 - Murtaza Magsi
2个回答

0
我不确定,但我认为这是因为你的变量times无限递增1,并且在某个时候达到了一个特殊数字:整数限制。 这是一个很大的数字,如果你使用32位操作系统或64位操作系统会有所不同。当它尝试将1添加到变量times并且达到整数限制时,浏览器会崩溃,因为这是处理器的一个错误,每个人都遇到过这个错误。由于迭代之间没有等待时间,只需几秒钟就能达到这个数字,在32位系统上是2,147,483,647,在64位系统上是9,223,372,036,854,775,807

来自微软网站的截图 查看我的截图以获取数据源(long int 是32位整数,llong int 是64位整数,ulong 和 ullong ints 是最小整数和最大整数之间的空间)。我的截图来自这篇微软文章

顺便说一下,也许(或者不是)你听说过2038年问题,这是因为Unix时间戳(自1970年1月1日以来经过的秒数)将达到32位整数的限制,时间将重新设置为1970年1月1日,但仅适用于32位系统。这就是为什么我们现在正在过渡到64位CPU的原因,因为在64位CPU上也会发生这个错误... 2262年4月11日星期五。

screenshot from an unix-timestamp converter annother screenshot from an unix-timestamp converter

希望有所帮助,并且与其他人报告的问题("JS是单线程的,所以浏览器崩溃")建立联系,我认为这是真实的,也是为什么在times变量达到整数限制之前,浏览器会出现错误。

-3

var times = 10;
for(var i = 0; i < times; i++)
{
    console.log(i);
}
.as-console-wrapper { max-height: 100% !important; top: 0; }

你增加的是“错误”的变量。
通过增加timesi永远不会“达到”它。

6
OP已经知道了问题所在,他们的问题是为什么这个无限循环会导致浏览器崩溃。 - adiga
@iAmOren 我故意递增次数。我对“修复崩溃”不感兴趣。我想知道它首先发生的“如何”和“为什么”。 - Murtaza Magsi
3
@MurtazaMagsi,你能详细阐述一下你是如何从这个答案中得出你所需的答案的吗?谢谢。 - Zain Ul Abideen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接