問題描述

我正在使用 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 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇