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