当前位置: 首页 > 知识库问答 >
问题:

" RangeError:超出了最大调用堆栈大小"为什么?

常甫
2023-03-14

如果我逃跑

Array.apply(null, new Array(1000000)).map(Math.random);

在铬33上,我得到

范围错误:已超出最大调用堆栈大小

为什么?

共有3个答案

琴修为
2023-03-14

您首先需要了解调用堆栈。了解调用堆栈还将使您清楚“函数层次结构和执行顺序”在JavaScript引擎中的工作原理。

调用堆栈主要用于函数调用(调用)。由于只有一个调用堆栈。因此,所有函数的执行都会从上到下一次推送和弹出一个。

这意味着调用堆栈是同步的。当您输入一个函数时,该函数的条目将推送到 Call 堆栈上,当您退出该函数时,将从调用堆栈中弹出相同的条目。因此,基本上,如果一切顺利,那么在开始和结束时,调用堆栈将被发现是空的。

现在,如果您提供了太多参数,或者在任何未处理的递归调用中被捕获。你会遇到

RangeError:超出最大调用堆栈大小

希望这有所帮助!

白和泽
2023-03-14

这里它失败在Array.apply(null, new Array(1000000))而不是. map调用。

所有函数参数都必须适合调用堆栈(至少每个参数的指针),因此在此情况下,调用堆栈的参数太多。

你需要理解什么是调用栈。

Stack是一种LIFO数据结构,就像一个只支持push和pop方法的数组。

让我用一个简单的例子来解释它是如何工作的:

function a(var1, var2) {
    var3 = 3;
    b(5, 6);
    c(var1, var2);
}
function b(var5, var6) {
    c(7, 8);
}
function c(var7, var8) {
}

当这里调用函数 a 时,它将调用 bc。当调用 bc 时,由于 Javascript 的作用域角色,a 的局部变量在那里无法访问,但是 Javascript 引擎必须记住局部变量和参数,因此它会将它们推入调用堆栈。假设你正在用像水仙这样的爪哇脚本语言实现一个JavaScript引擎。

我们将callStack实现为数组:

var call Stack = [];

每次调用的函数,我们都会将局部变量推送到堆栈中:

< code > call stack . push(currentcalvariables);

一旦函数调用完成(如在< code>a中,我们已经调用了< code>b,< code>b执行完毕,我们必须返回到< code>a),我们通过弹出堆栈来取回局部变量:

当前本地变量 = 调用堆栈();

因此,当在a中我们想再次调用c时,将局部变量推送到堆栈中。现在如您所知,为了高效,编译器定义了一些限制。在这里,当您执行Array.apply(null, new Array(1000000))时,您的realtLocalVariables对象将非常大,因为它内部将包含1000000变量。由于. application将把每个给定的数组元素作为参数传递给函数。一旦推送到调用堆栈,这将超过调用堆栈的内存限制,并抛出该错误。

同样的错误发生在无限递归(函数 a() { a() }) 上,因为太多次了,东西被推送到调用堆栈。

请注意,我不是一名编译器工程师,这只是对正在发生的事情的简化表示。它确实比这更复杂。通常,推送到调用堆栈的内容称为堆栈帧,其中包含参数、局部变量和函数地址。

陶英达
2023-03-14

浏览器无法处理那么多参数。例如,请参阅此片段:

alert.apply(window, new Array(1000000000));

这将产生< code>RangeError:超出最大调用堆栈大小,与您的问题相同。

要解决这个问题,请执行

var arr = [];
for(var i = 0; i < 1000000; i++){
    arr.push(Math.random());
}
 类似资料:
  • 问题内容: 我想这意味着有一个循环引用,但是对于我的一生,我无法猜测如何解决它。 有人有主意吗? http://plnkr.co/edit/aNcBcU?p=预览 检查Chrome中的调试控制台(例如),您将看到错误。冒犯的行是 通过以下方式在控制器上对scope.map进行“ $ watched” 问题答案: 这是因为您要比较对象是否相等,而不是参考。将您的声明更改为此:

  • 这是我在React中的第一个应用程序。在localhost中,一切正常,当我使用Github Pages部署时,我的应用程序(Info/Images/evenements)中的一些页面无法呈现。每次单击他们的链接访问他们时,我都会在控制台上看到一个白色页面和此错误: range error:object . tostring处超出了最大调用堆栈大小 同样,当我刷新页面时,github pages返

  • 我将redux添加到我的项目中进行状态管理,在添加reducer之前一切都很好 我认为每个中间件功能的下一步(操作)都会导致问题,但我不知道如何修复它。 我使用的是React 17.0.2,React redux 7.2.3,redux 4.1.2。 动作-- 中间件-- 中间件-- 减速机 -- 商店.js:

  • 问题内容: 我试图将文档批量插入MongoDB中(因此绕过Mongoose并使用本机驱动程序,因为Mongoose不支持批量插入文档数组)。我这样做的原因是为了提高写作速度。 我在以下代码中的console.log(err)处收到错误“ RangeError:超出最大调用堆栈大小”: 也许与Mongoose返回的响应数组的格式有关,这意味着我不能直接使用MongoDB进行本机插入吗?我已经在每个响

  • 当我为图表(react-chartjs-2)获取数据时,我收到了这个错误。我实现了try/catch块,但不知道如何删除这个错误。在Edge浏览器上,我得到了CRIPT28:SCRIPT28:堆栈空间不足 这是我在组件中调用的操作。 这是连接到redux存储的组件。它在我看来一切都很好。

  • React.js用props给后代组件发值错了? 我编写了前面的演示来测试使用向后代组件发送信息。但它导致了错误: 未捕获的范围错误:对象超过了最大调用堆栈大小。克隆元素 但是我在演示运行良好后才写,所以你能告诉我是什么原因导致错误吗?