2011-10-19 60 views
52

我收到了一些客户端JavaScript栈溢出问题特别是在IE浏览器, 这是一个第三方库,使一些函数调用内部,由于某种原因,他们偶尔只是由于制动在IE中发生的事情这是低堆栈限制。浏览器的Javascript堆栈大小限制

然后,我编写了一个小测试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> 

IE引发堆栈溢出时的值是3200左右,Firefox和Chrome会比IE处理了非常深刻的递归。

我想知道是否有办法将堆栈溢出异常与在IE或任何其他浏览器中在运行时引发它的Javascript函数绑定,以及它是否可以在堆栈中为堆栈跟踪提供函数链目前出现错误。

+0

这是一个问题吗? – BNL

+2

3200调用有很多堆栈空间。 Python程序员(当然,那些不愿意编写递归下降解析器或用简单的递归替换完美简单的循环)与1000个调用限制相处得很好。你在做什么? – delnan

+3

这个问题在疑问句模式下并不严谨,但最后一句“我想知道是否有......”可以从“Are there”开始,以问号结束,产生一个相当直接的问题。 – jball

回答

91

使用a simple test

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

的Internet Explorer

  • IE6:1130
  • IE7:2553
  • IE8:1475
  • IE9:20678
  • IE10:20677

的Mozilla Firefox

  • 3.6:3000
  • 4.0:9015
  • 5.0:9015
  • 6.0:9015
  • 7。0:65533
  • 8B3:63485
  • 17:50762
  • 18:52596
  • 19:52458
  • 42:281810

谷歌浏览器

  • 14:26177
  • 15:26168
  • 16:26166
  • 25:25090
  • 47:20878
  • 51:41753

的Safari

  • 4:52426
  • 5:65534
  • 9: 63444

歌剧

  • 10.10:9999
  • 10.62:32631
  • 11:32631
  • 12:32631

至于你的问题,使用浏览器的开发者工具来查看堆栈。在IE 8+中,点击F12,转到脚本选项卡,然后单击开始调试。当抛出异常时它会中断,你可以看到调用堆栈。您也可以使用Chrome的开发人员工具,Ctrl + Shift + J

+6

您也可以使用F12 for Chrome了 –

+1

随着测试http://jsfiddle.net/9YMDF/show/我已经得到〜21000为Chrome 28,26000..53000为Firefox 20+,在Windows 7 SP1 64位上为IE10约3000。 Opera 12.X的堆栈深度接近32768.我发现一个不幸的IE8安装堆栈深度等于276! – Victor

+0

您可以将这些结果与[此处链接的BrowserScope]进行比较(http://stackoverflow.com/questions/2805172/what-are-the-js-recursion-limits-for-firefox-chrome-safari-ie-etc) –

5

这是浏览器特定的,不仅是堆栈大小,还有优化,像尾递归优化和东西。我想这里唯一可靠的方法是以不会将大量东西放入堆栈的方式进行编码,或者手动测试(深入阅读每个浏览器的文档)。毕竟,当你看到“太多的递归”错误或类似的情况时,你已经知道你的代码有些问题。

+0

TCO是否真的在JavaScript中完成?我读ES6可能会得到支持,但我认为它还没有实施。 –

+0

现在,TCO落后于Chrome中的一个标志(正在评估两种不同的实现)。我没有意识到任何默认实现的浏览器。 –

+1

@JanusTroelsen:ES2015(“ES6”)的确需要引擎来完成TCO。 V8有它,但V8团队不认为它“稳定”,所以你必须启用它。 (V8将他们已经开始的功能归类为“发货”[已完成],“稳定”和“正在进行中”。TCO仍在“进行中”,但V8的所有三个代码生成器都具备基本功能。还没有将其推广到“稳定”,因为它们仍在优化/寻找/修正bug。更多信息:http:// stackoverflow。com/a/30369729/157247) –