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
相关产品推荐
相关产品推荐

