問題描述

我正在使用 Direct Web Remoting(DWR)JavaScript 庫文件,只能在 Safari(桌面和 iPad) 中發生錯誤,

它説

Maximum call stack size exceeded.

這個錯誤是什麼意思,完全停止處理?

也是 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);

次佳解決方案

你有時可以得到這個,如果你不小心導入/嵌入相同的 JS 文件兩次,值得檢查你的資源選項卡的檢查員:)

第三種解決方案

你的代碼中有一個遞歸循環 (即一個函數,最後一次又一次地調用自己的代碼,直到堆棧滿) 。

其他瀏覽器有更大的堆棧 (所以你得到一個超時),或者他們因為某些原因吞下了錯誤 (也許是一個很差的 try-catch) 。

發生錯誤時使用調試器檢查調用堆棧。

第四種方案

在我的情況下,我正在發送輸入元素而不是它們的值:

$.post( '',{ registerName: $('#registerName') } )

代替:

$.post( '',{ registerName: $('#registerName').val() } )

這凍結了我的 Chrome 標籤,甚至顯示了’Wait/Kill’ 對話框,當頁面無響應時…

第五種方案

檢查 Chrome 開發工具欄控制枱中的錯誤詳細信息,這將給您調用堆棧中的函數,並指導您導致導致錯誤的遞歸。

第六種方案

如果由於某種原因需要無限次進程/遞歸運行,可以在單獨的線程中使用 Webworker 。 http://www.html5rocks.com/en/tutorials/workers/basics/

如果要操作 dom 元素並重繪,請使用動畫 http://creativejs.com/resources/requestanimationframe/

參考文獻

注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇