我正在使用 Direct Web Remoting (DWR) JavaScript 库文件,并且仅在 Safari(桌面和 iPad)中出现错误
它说
超出了最大调用堆栈大小。
这个错误究竟是什么意思,它是否完全停止处理?
还有Safari
浏览器的任何修复(实际上在iPad Safari
,它说
JS:执行超过超时
我假设是相同的调用堆栈问题)
我正在使用 Direct Web Remoting (DWR) JavaScript 库文件,并且仅在 Safari(桌面和 iPad)中出现错误
它说
超出了最大调用堆栈大小。
这个错误究竟是什么意思,它是否完全停止处理?
还有Safari
浏览器的任何修复(实际上在iPad Safari
,它说
JS:执行超过超时
我假设是相同的调用堆栈问题)
这意味着在您的代码中的某个地方,您正在调用一个函数,该函数又调用另一个函数,依此类推,直到达到调用堆栈限制。
这几乎总是因为没有满足基本情况的递归函数。
考虑这个代码...
(function a() {
a();
})();
这是几次调用后的堆栈...
如您所见,调用堆栈会不断增长,直到达到一个限制:浏览器硬编码堆栈大小或内存耗尽。
为了修复它,请确保您的递归函数具有能够满足的基本情况......
(function a(x) {
// The following condition
// is the base case.
if ( ! x) {
return;
}
a(--x);
})(10);
如果您不小心导入/嵌入同一个 JavaScript 文件两次,有时会得到这个,值得在检查器的资源选项卡中检查。
就我而言,我发送的是输入元素而不是它们的值:
$.post( '',{ registerName: $('#registerName') } )
代替:
$.post( '',{ registerName: $('#registerName').val() } )
这将我的 Chrome 标签冻结到了一个点,它甚至没有向我显示页面无响应时的“等待/终止”对话框......
在您的代码中某处有一个递归循环(即最终一次又一次地调用自身直到堆栈已满的函数)。
其他浏览器要么有更大的堆栈(所以你会得到一个超时)或者他们出于某种原因吞下错误(可能是一个错误放置的 try-catch)。
发生错误时使用调试器检查调用堆栈。
检测 stackoverflows 的问题是有时堆栈跟踪会展开,您将无法看到实际发生的情况。
我发现 Chrome 的一些较新的调试工具对此很有用。
点击Performance tab
,确保Javascript samples
已启用,你会得到这样的东西。
溢出在哪里很明显!如果您单击,extendObject
您将能够实际看到代码中的确切行号。
您还可以查看可能有用也可能没有帮助的时间安排或红鲱鱼。
如果您实际上无法找到问题,另一个有用的技巧是console.log
在您认为问题所在的地方放置大量语句。上面的上一步可以帮助您解决这个问题。
在 Chrome 中,如果你重复输出相同的数据,它会像这样显示问题更清楚的地方。在这种情况下,堆栈在最终崩溃之前达到了 7152 帧: