Firefox、Chrome、Safari、IE等浏览器中的js递归限制是什么?

42

我有一些JavaScript代码,其中使用了相当深的递归,我想了解各种浏览器的递归限制(即“too much recursion”错误会发生的点)。

有没有人能够提供不同版本浏览器的确切数字?

2个回答

52

2
我在非常快速地阅读了这篇文章之后,随手做了这个:http://jsfiddle.net/TdWTs/ - endemic
1
@endemic 做得不错。我为这个问题制作了一个浏览器范围测试,链接为http://adamrich.name/recursion.html 如果我们能让很多人运行测试,我们可以获得一个关于浏览器和操作系统递归限制的最新表格。 - Adam
这些内容在2019年仍然适用吗? - kamentk
@kamentk 不可以,但你可以在这里看到一些较新的结果:http://www.browserscope.org/browse?category=usertest_ahBzfnVhLXByb2ZpbGVyLWhycg0LEgRUZXN0GL2psRQM - Adam
如果您需要更深的递归,请搜索“蹦床递归”。 - Martin Capodici
显示剩余3条评论

16

除了这里的答案,递归涉及到的函数也会影响结果。例如,仅向函数添加一些参数就可以改变结果:

var i=0;
function inc() {
    i++;
    inc();
}
inc();

给了我20923,但是

var i=0;
function inc(j, k, l) {
    i++;
    inc(l, k, j);
}
inc(1, 2, 3);

报告显示在Chromium 39控制台中测试结果为13949。 Firefox 34分别给出25085和13572。

在没有参数的inc()函数体周围添加try/catch块,在Chromium中会产生11413个帧,在Firefox中会产生13161个帧。使用三个参数和try/catch块时,Chrome和Firefox分别为8967和7517。

我的结论是,在浏览器中接近堆栈深度的应用程序可能只能根据类似于应用程序中使用的函数的实证测量来确定堆栈深度。


栈帧的大小(局部变量可能分配在栈上)决定了可以分配多少个栈帧(假设有固定的分配空间,这取决于操作系统和/或浏览器 - 假如使用可扩展的分配算法,则可以无限制地分配深度栈)。对于数字理论中有时需要的真正深度递归,您始终可以使用可扩展存储(例如对象或数组)来模拟堆栈。 - David Spector
1
@DavidSpector 确实,甚至有自动化解决方案,比如 https://www.stopify.org/! - jpolitz

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