问题描述

我正在使用 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 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛