Firefox、Chrome、Safari、IE 等的 js 递归限制是多少?

Posted

技术标签:

【中文标题】Firefox、Chrome、Safari、IE 等的 js 递归限制是多少?【英文标题】:What are the js recursion limits for Firefox, Chrome, Safari, IE, etc? 【发布时间】:2011-02-17 19:26:25 【问题描述】:

我有一些使用相当深的递归的 javascript 代码,我想了解各种浏览器中的递归限制是什么(即“递归过多”错误将发生的点)。

任何人对此有任何可靠的数字,按版本?

【问题讨论】:

【参考方案1】:

Nicholas C. Zakas writes in his blog:

Internet Explorer 7:1,789 Firefox 3:3,000 铬 1:21,837 Opera 9.62:10,000 Safari 3.2:500

还有更多关于不同浏览器和操作系统的数据here。

我创建了一个 Browserscope 测试来获取更多数据。 Please run it here.

更新:

以上结果现已过时,但the browserscope results 已更新:

IE 11:12,064 Firefox 65:20,614 铬 72:9,643 歌剧 57:9,638 Safari 12:32,035

【讨论】:

在快速阅读这篇文章后,我把它放在一起:jsfiddle.net/TdWTs @endemic 干得好。我在adamrich.name/recursion.html 为这个问题制作了一个浏览器范围,如果我们可以让很多人运行测试,我们可以获得浏览器和操作系统的最新限制表。 我的阅读理解能力需要更多的工作......完全跳过了您已经进行 Browserscope 测试的部分。我用几个浏览器运行它,令人惊讶的是 Chrome 的限制最低!哦,好吧,一位同事担心几百次递归迭代(wat),所以我有兴趣找到真相。 @endemic 我刚刚制作并编辑了旧答案以将其添加。我使用您的代码进行测试。感谢您运行它! 这在 2019 年仍然适用【参考方案2】:

要补充这里的答案,这也可能取决于递归中涉及的函数。例如,只需在函数中添加几个参数就可以改变结果:

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);

报告 13949(在 Chromium 39 的控制台中测试)。 Firefox 34 分别给出 25085 和 13572。

在零参数 inc() 的主体周围添加一个 try/catch 块,在 Chromium 中为 11413 帧,在 Firefox 中为 13161 帧。使用 3 个参数和 try/catch 块,Chrome 中为 8967,Firefox 中为 7517。

我从中得出的结论是,在浏览器中工作在堆栈深度附近的应用程序可能只能根据与应用程序中使用的函数类似的函数的经验测量来计算这一点。

【讨论】:

堆栈帧的大小(局部变量可能分配在堆栈上)决定了可以分配多少堆栈帧(假设分配空间固定,这取决于操作系统和/或浏览器——给定可扩展的分配算法,几乎可以永远分配深堆栈)。您始终可以使用可扩展存储(例如对象或数组)来模拟堆栈,以实现数论有时需要的真正深度递归。 @DavidSpector 实际上,甚至还有自动化解决方案,例如 stopify.org!

以上是关于Firefox、Chrome、Safari、IE 等的 js 递归限制是多少?的主要内容,如果未能解决你的问题,请参考以下文章

常用浏览器内核!IE,Chrome ,Firefox,Safari,Opera 等内核

scss 最适合每个人的灵活! (safari,chrome,IE,firefox)包装

IE11和 Chrome,Firefox,Safari 等浏览器比有啥差距

无法在 Firefox 和 IE9 中获取数据,但在 Chrome 和 Safari 中运行良好

Http/2 站点仅在 Safari 9 上无法加载 - 在 Chrome、IE、Edge、Firefox 上加载正常

CSS:Chrome 和 Safari 似乎为宽度“添加”边框,而 IE、Firefox 和 Opera 没有