浏览器Javascript堆栈大小限制

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (31)

我在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>

如果值大约是3200,IE会引发堆栈溢出,如果与IE相比,Firefox和Chrome可以处理非常深的递归。

我想知道是否有一种方法可以将堆栈溢出异常与在IE或任何其他浏览器中在运行时引发堆栈溢出异常的JavaScript函数结合起来,以及是否可以在堆栈中为堆栈跟踪函数链错误被提出。

提问于
用户回答回答于

使用一个简单的测试

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

Internet Explorer

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

火狐浏览器

  • 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

苹果浏览器

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

Opera

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

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

用户回答回答于

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

扫码关注云+社区