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