最大呼叫堆栈大小超出错误

JavaScript

路易凯

2020-03-12

我正在使用Direct Web Remoting(DWR)JavaScript库文件,并且仅在Safari(台式机和iPad)中出现错误

它说

超出最大呼叫堆栈大小。

该错误的确切含义是什么,它会完全停止处理吗?

也适用于Safari浏览器的所有修复程序(实际上在上iPad Safari

JS:执行超出超时

我假设是相同的调用堆栈问题)

第1200篇《最大呼叫堆栈大小超出错误》来自Winter(https://github.com/aiyld/aiyld.github.io)的站点

22个回答
老丝村村 2020.03.12

当未声明该变量时,我试图分配一个变量,即一个值。

声明变量修复了我的错误。

古一古一 2020.03.12

有时由于转换数据类型而发生,例如,您有一个被视为字符串的对象。

例如,在js客户端中的nodejs中的nodejs中的socket.id不是字符串。要将其用作字符串,您必须在前面添加单词String:

String(socket.id);
小碗儿 2020.03.12

以我为例,我错误地分配了相同的变量名,并将其分配给val函数“ class_routine_id”

var class_routine_id = $("#class_routine_id").val(class_routine_id);

它应该像:

 var class_routine_id = $("#class_routine_id").val(); 
EvaPro 2020.03.12

我正在与(npm 6.9.0&node 10.16.1一起使用React-Native 0.61.5

当我在Project中安装任何新库时,

(例如,npm install @ react-navigation / native --save)

最大呼叫堆栈大小超出错误

为此,我尝试

sudo npm缓存清理--force

(注意:-以下命令通常需要1到2分钟的时间, 具体取决于您的npm缓存大小)

米亚 2020.03.12

在Angular中,如果您使用的是mat-select并且有400多个选项,则可能会发生此错误 https://github.com/angular/components/issues/12504

您必须更新@ angular / material版本

西里伽罗 2020.03.12

就我而言,我在ajax调用中遇到此错误,并且尝试传递该变量的数据尚未定义,这向我显示了此错误,但未描述未定义的变量。我添加了定义,变量n获得了价值。

西门Sam 2020.03.12

我有这个错误,因为我有两个同名的JS函数

路易卡卡西 2020.03.12

如果您使用的是Google地图,请检查所传递的经纬度是否new google.maps.LatLng格式正确。就我而言,它们是作为未定义的传递的。

小哥达蒙卡卡西 2020.03.12

您可以在crome浏览器中找到递归函数,按ctrl + shift + j,然后按“源”选项卡,这将为您提供代码编译流程,并且您可以在代码中使用断点来查找。

乐达蒙 2020.03.12

下面的相同代码的两个调用如果减少1,则在我的计算机上的Chrome 32中均可运行,例如17905与17904。如果按原样运行,它们将产生错误“ RangeError:超出最大调用堆栈大小”。似乎此限制不是硬编码的,而是取决于计算机的硬件。看起来,如果作为函数调用,则该自我施加的限制要高于作为方法调用时的约束,即,该特定代码在作为函数调用时使用的内存更少。

作为方法调用:

var ninja = {
    chirp: function(n) {
        return n > 1 ? ninja.chirp(n-1) + "-chirp" : "chirp";
    }
};

ninja.chirp(17905);

作为功​​能调用:

function chirp(n) {
    return n > 1 ? chirp( n - 1 ) + "-chirp" : "chirp";
}

chirp(20889);
GreenGil 2020.03.12

这也会导致Maximum call stack size exceeded错误:

var items = [];
[].push.apply(items, new Array(1000000)); //Bad

同样在这里:

items.push(...new Array(1000000)); //Bad

Mozilla Docs中

但要注意:以这种方式使用应用时,存在冒超出JavaScript引擎参数长度限制的风险。应用带有过多参数(考虑成千上万个参数)的函数的结果因引擎而异(JavaScriptCore的硬编码参数限制为65536),因为该限制(甚至包括任何过大堆栈的性质)行为)未指定。一些引擎将引发异常。更有害的是,其他人将任意限制实际传递给应用函数的参数数量。为了说明后一种情况:如果这样的引擎有四个参数的限制(实际上的限制当然要高得多),就好像参数5、6、2、3已被传递到上面的示例中一样,而不是整个数组。

因此,请尝试:

var items = [];
var newItems = new Array(1000000);
for(var i = 0; i < newItems.length; i++){
  items.push(newItems[i]);
}
Jun Li 2020.03.12

我们最近在我们正在处理的管理网站中添加了一个字段-contact_type ...容易吗?好吧,如果您调用选择的“类型”并尝试通过jquery ajax调用发送该消息,它将失败,并且此错误将深深地隐藏在jquery.js中。不要这样做:

$.ajax({
    dataType: "json",
    type: "POST",
    url: "/some_function.php",
    data: { contact_uid:contact_uid, type:type }
});

问题是type:type-我相信是我们将参数命名为“ type”-拥有一个名为type的值变量不是问题。我们将其更改为:

$.ajax({
    dataType: "json",
    type: "POST",
    url: "/some_function.php",
    data: { contact_uid:contact_uid, contact_type:type }
});

并相应地重写some_function.php-问题已解决。

神奇古一 2020.03.12

检查您是否有一个调用自身的函数。例如

export default class DateUtils {
  static now = (): Date => {
    return DateUtils.now()
  }
}
西里Near 2020.03.12

如果出于某种原因需要无限的进程/递归运行,则可以在单独的线程中使用Webworker。 http://www.html5rocks.com/zh-CN/tutorials/workers/basics/

如果要操纵dom元素并重绘,请使用动画 http://creativejs.com/resources/requestanimationframe/

小宇宙GO 2020.03.12

几乎每个答案都指出,这只能由无限循环引起。事实并非如此,否则您可能会通过深度嵌套的调用来使堆栈超负荷运行(并不是说这很有效,但这肯定在可能的范围内)。如果可以控制JavaScript VM,则可以调整堆栈大小。例如:

node --stack-size=2000

另请参阅:如何增加Node.js中的最大调用堆栈大小

小哥达蒙卡卡西 2020.03.12

以我为例,两个jQuery模态相互重叠显示。防止这种情况解决了我的问题。

GO小胖 2020.03.12

在Chrome开发者工具栏控制台中检查错误详细信息,这将为您提供调用堆栈中的功能,并指导您进行导致错误的递归。

Mandy古一 2020.03.12

就我而言,我正在使用以下命令将大字节数组转换为字符串:

String.fromCharCode.apply(null, new Uint16Array(bytes))

bytes 包含数百万个条目,太大而无法容纳在堆栈中。

JimGO 2020.03.12

这意味着在代码的某处,您正在调用一个函数,该函数又调用另一个函数,依此类推,直到达到调用堆栈限制。

这几乎总是因为没有满足基本情况的递归函数。

查看堆栈

考虑这段代码...

(function a() {
    a();
})();

Here is the stack after a handful of calls...

网页检查器

As you can see, the call stack grows until it hits a limit: the browser hardcoded stack size or memory exhaustion.

In order to fix it, ensure that your recursive function has a base case which is able to be met...

(function a(x) {
    // The following condition 
    // is the base case.
    if ( ! x) {
        return;
    }
    a(--x);
})(10);
逆天LEY逆天 2020.03.12

代码中的某个地方有一个递归循环(即,一个函数最终会一次又一次地调用自身,直到堆栈已满)。

其他浏览器的堆栈较大(因此您会超时),或者由于某种原因(可能是放置错误的try-catch)吞没了错误。

错误发生时,使用调试器检查调用堆栈。

猿阿飞Tom 2020.03.12

检测stackoverflows的问题是,有时堆栈跟踪会消失,您将无法看到实际发生的情况。

我发现一些Chrome较新的调试工具对此有用。

点击Performance tab,确保Javascript samples已启用,您将获得类似的信息。

很明显这里有溢出!如果单击,extendObject您将可以在代码中实际看到确切的行号。

在此处输入图片说明

您还可以看到可能会有所帮助的时机,也可能会看到红鲱鱼。

在此处输入图片说明


如果您实际上找不到问题,则另一个有用的技巧是console.log在您认为问题所在的地方放置很多语句。上面的上一步可以帮助您。

在Chrome中,如果您重复输出相同的数据,它将像这样显示,以更清楚地指出问题所在。在这种情况下,堆栈在最终崩溃之前命中了7152帧:

在此处输入图片说明

樱Davaid 2020.03.12

如果您不小心两次导入/嵌入相同的JavaScript文件,有时可以得到此文件,值得在检查器的“资源”选项卡中进行检查。

问题类别

JavaScript Ckeditor Python Webpack TypeScript Vue.js React.js ExpressJS KoaJS CSS Node.js HTML Django 单元测试 PHP Asp.net jQuery Bootstrap IOS Android