You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript递归函数even(1)执行:变量最终值与控制台输出疑问

递归函数even中变量num的取值解析

嘿,这个问题其实是搞混了递归调用栈里的变量作用域,我来给你唠明白~

首先咱把代码再贴一遍,方便对照看:

function even(num) {
    //console.log(num) => shows 1 & then 0 before terminating.
    if (num === 0) {
        return true;
    } else {
        return !even(num - 1);
    }
}
console.log(even(1));

先捋清楚递归的执行流程

当你调用even(1)时,整个执行链路是这样的:

  • 第一次调用even(1):这里的num参数是1,不满足num === 0的条件,进入else分支,调用even(0)
  • 第二次调用even(0):这个新的函数调用会创建独立的执行环境,里面的num是0,满足条件后直接返回true
  • 回到第一次调用的even(1):拿到even(0)返回的true,执行!true得到false,这个函数也执行完毕,最终控制台输出false

为什么Chrome控制台显示num=1?

你在开发者工具里看到的num=1,是最上层调用栈帧里的变量值。递归调用时,每一次函数调用都会在调用栈里新建一个独立的栈帧,每个栈帧里的num都是专属的局部变量,互相不干扰。

当even(0)执行完return true后,它的栈帧就会被弹出调用栈并销毁。最后留在栈里的是最开始的even(1)的栈帧,所以你查看时看到的是这个帧里的num=1。

结论

不存在“变量num的最终值”这种说法——因为每个递归调用都有自己独立的num:

  • 最外层的even(1)里,num从始至终都是1
  • 深层的even(0)里,num是0,但这个调用结束后它的变量就被销毁了

你注释里提到打开console.log(num)会先显示1再显示0,就是因为两次调用分别执行了打印语句:先打印第一次调用的1,再打印第二次调用的0,之后才逐层返回。

内容的提问来源于stack exchange,提问作者techie_28

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:05:36