javascript递归堆栈溢出

时间:2017-04-11 08:38:03

标签: javascript node.js recursion stack-overflow

有没有人会解释为什么结果会有所不同?

// test two
    function computeMaxCallStackSize() {
        try {
            return 1 + computeMaxCallStackSize();
        } catch (e) {
            return 1;
        }
    }

    console.log(computeMaxCallStackSize());

结果 17958

node.js v6.9.1

结果 15714

当函数'computeMaxCallStackSize'的位置不同时,结果也不同。什么原因?非常感谢!

运行环境: OS:Win7 <!-- <dependency> --> <!-- <groupId>org.apache.parquet</groupId> --> <!-- <artifactId>parquet-hadoop</artifactId> --> <!-- <version>1.9.0</version> --> <!-- </dependency> --> <!-- <dependency> --> <!-- <groupId>org.apache.parquet</groupId> --> <!-- <artifactId>parquet-common</artifactId> --> <!-- <version>1.9.0</version> --> <!-- </dependency> -->

1 个答案:

答案 0 :(得分:2)

它不是位置,而是在第一个函数中导​​致这种情况的执行顺序

 return computeMaxCallStackSize() + 1;

先调用增量,然后再添加1

return 1 + computeMaxCallStackSize();

如果您将两个return语句都视为相同,那么它会导致相同的值。在后面的一个数字首先是js调用堆栈比第一个更快地超过溢出。 callstack值取决于执行的顺序,因为在第二次更改顺序时,随着递归的发生,你会得到一个较低的值。

您还可以通过添加一些console.log()来检查,或者局部变量调用堆栈会随着执行语句的增加而逐渐减少。

如果您在两者中都尝试computeMaxCallStackSize() + 1;,则会获得相同的值。