浏览器Javascript堆栈大小限制

浏览器Javascript堆栈大小限制,javascript,browser,stack,limit,Javascript,Browser,Stack,Limit,我在IE浏览器中遇到了一些客户端Javascript堆栈溢出问题, 这是在第三方库中发生的,该库进行了一些函数调用,出于某种原因,它们偶尔会在IE中停止,这只是因为它的堆栈限制较低 然后,我编写了一个小测试HTML来测试一些浏览器的堆栈大小限制,发现IE8实际上有一个小的堆栈限制,如果与运行在Windows 7操作系统、8Gb RAM的笔记本电脑上的FF 7或Chrome 14相比: <html> <body> <!-- begin Script: -->

我在IE浏览器中遇到了一些客户端Javascript堆栈溢出问题, 这是在第三方库中发生的,该库进行了一些函数调用,出于某种原因,它们偶尔会在IE中停止,这只是因为它的堆栈限制较低

然后,我编写了一个小测试HTML来测试一些浏览器的堆栈大小限制,发现IE8实际上有一个小的堆栈限制,如果与运行在Windows 7操作系统、8Gb RAM的笔记本电脑上的FF 7或Chrome 14相比:

<html>
<body>

<!-- begin Script: -->
<script type="text/javascript">

function doSomething(){

  var i = 3200;
  doSomethingElse(i);

}

function doSomethingElse(i){
  if (i == 0) return -1;
  doSomethingElse(i-1);
}

doSomething(); 

</script>
<!-- END OF PAGE -->

</body>
</html>

函数doSomething(){
var i=3200;
doSomethingElse(i);
}
函数doSomethingElse(i){
如果(i==0)返回-1;
doSomethingElse(i-1);
}
doSomething();
当值在3200左右时,IE会引发堆栈溢出,如果与IE相比,Firefox和Chrome可以处理非常深的递归


我想知道是否有办法将堆栈溢出异常与IE或任何其他浏览器中运行时引发它的Javascript函数联系起来,以及它是否可以在引发错误时,通过堆栈中的函数链给出堆栈跟踪。

这是特定于浏览器的,不仅仅是堆栈大小,还有优化,比如尾部递归优化等等。我想这里唯一可靠的事情是以一种不会将大量内容放入堆栈的方式编写代码,或者手动测试(深入阅读)每个浏览器的文档。毕竟,当您看到“太多递归”错误或类似错误时,您已经知道您的代码确实有问题。

这是特定于浏览器的,不仅是堆栈大小,还有优化,比如尾部递归优化等等。我想这里唯一可靠的事情是以一种不会将大量内容放入堆栈的方式编写代码,或者手动测试(深入阅读)每个浏览器的文档。毕竟,当您看到“太多递归”错误或类似错误时,您已经知道您的代码确实有问题。

使用一个简单的测试:

var i=0;
功能公司{
i++;
公司();
}
试一试{
公司();
}
捕获(e){
//StackOverflow沙箱添加一个不被此代码计数的帧
//手动递增一次
i++;
log('当前浏览器中的最大堆栈大小为',i');
}
使用简单的测试:

var i=0;
功能公司{
i++;
公司();
}
试一试{
公司();
}
捕获(e){
//StackOverflow沙箱添加一个不被此代码计数的帧
//手动递增一次
i++;
log('当前浏览器中的最大堆栈大小为',i');


}
3200次调用占用了大量的堆栈空间。Python程序员(好吧,那些不致力于编写递归下降解析器或用递归替换完全简单的循环的程序员)可以很好地适应1000次调用限制。你在干什么?这句话在疑问句中没有严格的措辞,但最后一句“我想知道是否有…”可以以“是否有”开头,以问号结尾,产生一个相当直接的问题。谢谢你的反馈,我会更好地澄清问题3200次调用有足够的堆栈空间。Python程序员(好吧,那些不致力于编写递归下降解析器或用递归替换完全简单的循环的程序员)可以很好地适应1000次调用限制。你在干什么?这句话在问句模式中没有严格的措辞,但最后一句“我想知道是否有…”可以以“有没有”开头,以问号结尾,产生一个相当直接的问题。感谢反馈,我会更好地澄清问题。你可以使用F12进行Chrome tooWith测试,我有~21000的Chrome 28,26000..53000用于Firefox 20+,3000用于Windows 7 SP1 64位上的IE10。Opera 12.X的堆栈深度接近32768。我发现了一个不幸的IE8安装,堆栈深度等于276!您可以将这些结果与Microsoft Edge上的151102进行比较,而在IE11上则是54375!我认为这些数字不会映射到浏览器,而是映射到应用程序当前保留的内存。因此,答案大相径庭。例如,我刚刚运行了这个测试,Chrome56得到了20922(有很多扩展),而相当普通的Firefox49得到了8921。使用绝对库存的边缘浏览器,我得到了16615。你可以使用F12进行Chrome测试,我得到了约21000用于Chrome 28,26000..53000用于Firefox 20+,3000用于Windows 7 SP1 64位上的IE10。Opera 12.X的堆栈深度接近32768。我发现了一个不幸的IE8安装,堆栈深度等于276!您可以将这些结果与Microsoft Edge上的151102进行比较,而在IE11上则是54375!我认为这些数字不会映射到浏览器,而是映射到应用程序当前保留的内存。因此,答案大相径庭。例如,我刚刚运行了这个测试,Chrome56得到了20922(有很多扩展),而相当普通的Firefox49得到了8921。使用绝对稳定的边缘浏览器,我得到了16615。TCO真的是用JavaScript完成的吗?我读到ES6可能会得到支持,但我认为它还没有被实现。TCO现在在chrome中有一个标志(正在评估两种不同的实现)。我不知道有任何浏览器默认实现了它。@JanusTroelsen:ES2015(“ES6”)确实需要引擎来实现TCO。V8有它,但是V8团队不认为它是“稳定的”,所以你必须启用它。(V8将他们开始使用的功能分类为“shipping”[done]、“stable”和“InProgress”。TCO仍然“InProgress”,但V8的三个代码生成器都有基础。我认为他们还没有将其升级为“stable”,因为他们仍在优化/发现错误/修复错误。更多信息如下:)目前,safari是唯一一款具有适当TCO功能的浏览器。一个“将大量的东西放在堆栈上”的用例是
array1.push(…array2)
,它比
array1=array1.concat(array2)
快得多,但抛出了“max st”