1. ホーム
  2. javascript

[解決済み] ブラウザ Javascript スタックサイズ制限

2023-05-20 15:22:11

質問

IE ブラウザで特に、クライアント側の Javascript のスタック オーバーフロー問題が発生します。 これは、いくつかの関数呼び出しを行うサード パーティ ライブラリ内で発生しており、何らかの理由で、スタック制限が低いために IE でのみ時々ブレーキがかかります。

そこで、いくつかのブラウザのスタック サイズの制限をテストするために小さなテスト HTML を作成したところ、Windows 7 OS、8GB RAM のラップトップで動作する FF 7 または Chrome 14 と比較すると、IE8 は実際に小さなスタック制限を持っていることがわかりました。

<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 関数と結びつける方法があるかどうか、また、エラーが発生した瞬間にスタック内の関数のチェーンでスタックトレースを与えることができるかどうかを知りたいのです。

どのように解決するのですか?

簡単なテストを使って

var i = 0;
function inc() {
  i++;
  inc();
}
    
try {
  inc();
}
catch(e) {
  // The StackOverflow sandbox adds one frame that is not being counted by this code
  // Incrementing once manually
  i++;
  console.log('Maximum stack size is', i, 'in your current browser');
}

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

  • 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
  • 89: 10746
  • 91: 26441

グーグルクローム

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

サファリ

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

Safari iOS

  • 15: 7909

オペラ

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

エッジ

  • 87: 13970
  • 93: 13903

ヤンデックス

  • 21: 13909

ご質問の件ですが、ブラウザの開発者ツールでスタックを確認してください。 IE 8+の場合、以下をヒットします。 F12 例外が発生するとブレークし、コールスタックが表示されます。 また、Chromeのデベロッパーツールを使用することもできます。 Ctrl + シフト + J .