首页 > 解决方案 > nodejs递归调用栈报错,但是代码应该没问题

问题描述

此代码在节点 12 中出错,我想知道为什么?

function nloop(i, func) {
  function recurse(obj, i, count) {
    obj[count += 1] = func.call(null, count);
    if (count === i) return obj;
    return recurse(obj, i, count);
  };
  return recurse([], i - 1, -1);
};

var data = nloop(1000000, i => Math.round(Math.random() * 1000000));

                          ^
RangeError: Maximum call stack size exceeded
    at /Users/j/dev/algos/perf/mergesort.perf.js:20:27
    at recurse (/Users/j/dev/algos/nloop.js:3:26)
    at recurse (/Users/j/dev/algos/nloop.js:5:12)
    at recurse (/Users/j/dev/algos/nloop.js:5:12)
    at recurse (/Users/j/dev/algos/nloop.js:5:12)
    at recurse (/Users/j/dev/algos/nloop.js:5:12)
    at recurse (/Users/j/dev/algos/nloop.js:5:12)
    at recurse (/Users/j/dev/algos/nloop.js:5:12)
    at recurse (/Users/j/dev/algos/nloop.js:5:12)
    at recurse (/Users/j/dev/algos/nloop.js:5:12)

我不相信有一个实际的调用堆栈错误?

标签: javascriptnode.js

解决方案


此代码在节点 12 中出错,我想知道为什么?

节点 12 中的最大调用堆栈大小小于 1,000,000,这是您的代码完成所需的大小。我使用 12.7.0 进行了测试,我看到最大堆栈大小为 12,461

原则上,尾调用优化应该可以让这段代码工作,但是node没有实现尾调用优化(来源:https ://node.green/#ES2015-optimisation-proper-tail-calls--tail-呼叫优化- )


推荐阅读