javascript递归堆栈溢出

标签 javascript node.js recursion stack-overflow

有没有人可以解释为什么下面的结果不同?

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

console.log(computeMaxCallStackSize()); 

结果是17958

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

    console.log(computeMaxCallStackSize());

结果是15714

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

运行环境: node.js v6.9.1 操作系统:Win7

最佳答案

在第一个函数语句中导致这个的不是位置而是执行顺序

 return computeMaxCallStackSize() + 1;

先调用增量再加1

return 1 + computeMaxCallStackSize();

如果您尝试将两个 return 语句相同,那么它会导致相同的值。在后面的一个中,因为数字是第一个,所以 js 调用堆栈比第一个更快地溢出。调用堆栈值取决于执行顺序,因为在 2nd 中你更改顺序你会得到一个较低的值,因为递归稍后发生。

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

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

关于javascript递归堆栈溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43340776/

相关文章:

javascript - jQuery 下拉菜单链接不起作用

javascript - 如何使用requirejs保证javascript中的依赖类

node.js - NodeJS 和 socket.io 聊天定制

node.js - 如何获取在 NodeJS 中执行的脚本的文件名?

java - Java 中的尾调用优化

php - 使用固定顺序的递归从 MySQL 数据库创建嵌套页面列表

javascript - 在 Nuxt 中使用 Sharp 包的问题

javascript - 如何将 Kotlin 编译成 TypeScript?

node.js - 如何使用机器人框架中的每条消息创建和发送反向 channel 事件?

F# 中的递归 |发生了什么?