最大コールスタックサイズ超過エラー

Direct Web Remoting(DWR)のJavaScriptライブラリファイルを使用していますが、Safari(デスクトップおよびiPad)でのみエラーが発生します。

これは

呼び出しスタックの最大サイズを超えました。

このエラーは具体的にどのような意味があり、完全に処理が止まってしまうのでしょうか?

また、「Safari」ブラウザの修正方法も教えてください。

JS:execution exceeded timeout

と表示されますが、これは同じコールスタックの問題だと思われます。)

ソリューション

つまり、コードのどこかで関数を呼び出し、その関数がまた別の関数を呼び出し、といった具合にコールスタックの限界に達するまで繰り返しているのです。

これはほとんどの場合、満たされていないベースケースを持つ再帰関数が原因です。

スタックを見る

次のようなコードを考えてみましょう。

(function a() {
    a();
})();

数回の呼び出し後のスタックは以下のとおりです。

.

ご覧のとおり、コールスタックは、ブラウザにハードコードされたスタックサイズやメモリの枯渇などの制限に達するまで成長します。

この問題を解決するには、再帰関数のベースケースが満たされているかどうかを確認してください...

(function a(x) {
    // The following condition 
    // is the base case.
    if ( ! x) {
        return;
    }
    a(--x);
})(10);
解説 (16)

同じJavaScriptファイルを誤って2回インポート/エンベッドした場合にこの現象が発生することがあります。

解説 (6)

コードのどこかに再帰的なループ(スタックがいっぱいになるまで何度も自分自身を呼び出す関数)があります。

他のブラウザでは、より大きなスタックを持っているか(そのため、代わりにタイムアウトが発生する)、何らかの理由でエラーを飲み込んでいるか(たぶん、try-catchがうまく配置されていない)。

エラーが発生したら、デバッガを使ってコールスタックを確認してください。

解説 (3)