我正在使用 Direct Web Remoting (DWR) JavaScript 库文件,但在 Safari(桌面和 iPad)上出现了错误。
它显示:
Maximum call stack size exceeded.
这个错误具体意味着什么?是否会完全停止处理?
此外,是否有任何修复方案适用于 Safari
浏览器?(实际上,在 iPad Safari
上,它显示:
JS:执行超时
我认为这是同样的调用栈问题。)
我正在使用 Direct Web Remoting (DWR) JavaScript 库文件,但在 Safari(桌面和 iPad)上出现了错误。
它显示:
Maximum call stack size exceeded.
这个错误具体意味着什么?是否会完全停止处理?
此外,是否有任何修复方案适用于 Safari
浏览器?(实际上,在 iPad Safari
上,它显示:
JS:执行超时
我认为这是同样的调用栈问题。)
这意味着在您的代码中,您调用了一个函数,该函数又调用另一个函数,以此类推,直到达到调用栈限制。
这几乎总是由于递归函数存在未满足的基本情况。
考虑以下代码...
(function a() {
a();
})();
以下是几次调用后的调用堆栈...
可以看到,调用堆栈会增长,直到达到限制为止:浏览器硬编码的堆栈大小或内存耗尽。
要修复它,请确保您的递归函数具有基本情况,该基本情况能够得到满足...
(function a(x) {
// The following condition
// is the base case.
if ( ! x) {
return;
}
a(--x);
})(10);
在我的情况下,我发送了输入元素而不是它们的值:
$.post( '',{ registerName: $('#registerName') } )
改为:
$.post( '',{ registerName: $('#registerName').val() } )
这导致我的Chrome浏览器标签页冻结,无法显示“等待/终止”对话框,即使页面不响应。
如果您不小心两次导入/嵌入相同的JavaScript文件,则有时会出现此问题。建议在检查器的资源选项卡中进行检查。
你的代码中存在递归循环(即一个函数不断调用自身,直到堆栈满)。
其他浏览器要么有更大的堆栈(因此您会超时),要么由于某种原因(可能是糟糕的try-catch安排)吞下了错误。
使用调试器检查发生错误时的调用堆栈。
console.log
语句。上面的步骤可以帮助你做到这一点。在我的情况下,我使用以下方法将一个大的字节数组转换为字符串:
String.fromCharCode.apply(null, new Uint16Array(bytes))
bytes
包含数百万条目,这太大了无法放在堆栈中。
var uintArray = new Uint16Array(bytes); var converted = []; for (var i = 0; i < uintArray.length; i++) {converted.push(String.fromCharCode(uintArray[i]))};
- Nate GlennString.fromCharCode()
。我认为这将是等效的:const batchSize = 4096;
const strings = [];
for (let i = 0; i < uintArray.length; i += batchSize) {
const end = i + batchSize < uintArray.length ? i + batchSize : undefined;
strings.push(String.fromCharCode(...uintArray.slice(i, end)));
}
const converted = strings.join("");
- Ken Lyonvar items = [];
[].push.apply(items, new Array(1000000)); //Bad
我也是:
items.push(...new Array(1000000)); //Bad
var items = [];
var newItems = new Array(1000000);
for(var i = 0; i < newItems.length; i++){
items.push(newItems[i]);
}
el.append(...divs)
会导致此错误。 - chovy到点击事件中:e.stopPropagation()
$(document).on("click", ".remove-discount-button", function (e) {
e.stopPropagation();
//some code
});
$(document).on("click", ".current-code", function () {
$('.remove-discount-button').trigger("click");
});
<div class="current-code">
<input type="submit" name="removediscountcouponcode" value="
title="Remove" class="remove-discount-button">
</div>
在我的情况下,是因为我有两个变量使用了相同的名称!
在Chrome的开发者工具栏控制台中查看错误详情,这将向你展示调用栈中的函数,并指导你找到导致错误的递归。
data
传递变量时(未声明变量),我遇到了这个错误。通过声明变量来修复了这个错误。 - phpfresher