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