浏览器Javascript堆栈大小限制

gui*_*ebl 64 javascript browser stack limit

我在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>
Run Code Online (Sandbox Code Playgroud)

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

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

jos*_*736 118

使用简单的测试:

var i=0;
function inc() {
    i++;
    inc();
}
inc();
Run Code Online (Sandbox Code Playgroud)

IE浏览器

  • 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

歌剧

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

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

  • 你也可以使用F12 for Chrome (7认同)
  • 我认为数字不会映射到浏览器,而是映射到应用程序保留的内存_currently_.因此,答案差异很大.例如,我刚刚进行了测试,我得到了20922用于Chrome 56(带有很多扩展名),8921用于一个相当普通的香草Firefox 49.使用*绝对库存*边缘浏览器,我得到16615. (5认同)

Nik*_*off 6

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