web-dev-qa-db-ja.com

ブラウザのJavaScriptスタックサイズの制限

IEブラウザーで、これはいくつかの関数呼び出しを行うサードパーティライブラリ内で発生し、何らかの理由で時々IEはスタック制限が低いためのみです。

次に、いくつかのブラウザーのスタックサイズ制限をテストするために小さなテストHTMLをコーディングし、IE 7の実際のスタック制限はFF 7またはChrome 14とWindows 7のラップトップで比較した場合OS、8Gb RAM:

<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関数とスタックオーバーフロー例外を結び付ける方法があるかどうか、それがチェーンとスタックトレースを与えることができるかどうかを知りたいエラーが発生した時点でのスタック内の機能。

61
guilhebl

簡単なテスト を使用:

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

インターネットエクスプローラ

  • 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

サファリ

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

Opera

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

質問に関しては、ブラウザの開発者ツールを使用してスタックを確認してください。 In IE 8+、ヒット F12、[スクリプト]タブに移動し、[デバッグの開始]をクリックします。例外がスローされると中断し、コールスタックを確認できます。 Chromeのデベロッパーツールを使用することもできますが、 Ctrl+Shift+J

110
josh3736

これはブラウザ固有であり、スタックサイズだけでなく、最適化(末尾再帰の最適化など)も行います。ここで唯一信頼できることは、大量のスタックをスタックに入れない方法でコーディングすること、または各ブラウザーを手動でテストすることです(ドキュメントの詳細を読む)。結局のところ、「再帰が多すぎる」などのエラーが表示された場合、コードに実際に問題があることが既にわかっています。

5
Nikoloff