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

JavaScript递归示例中const变量未报错原因及执行流程疑问

关于freeCodeCamp递归countup示例的疑问解答

先明确你提到的countup示例的典型实现(按freeCodeCamp常见的递归countup函数):

function countup(n) {
  if (n < 1) {
    return [];
  } else {
    const countArray = countup(n - 1);
    countArray.push(n);
    return countArray;
  }
}

疑问一:const声明的countArray为什么不报错?

你混淆了const的不可重赋值特性和递归的函数执行上下文:

  • const的核心规则是:在同一个执行上下文里,用const声明的变量不能被重新赋值(比如不能写countArray = 新值),但它不禁止修改变量指向的对象(比如数组的push操作是修改数组本身,不是重赋值countArray)。
  • 更关键的是:每次递归调用countup(n-1),都会创建一个全新的函数执行上下文,每个上下文里的countArray都是独立的局部变量——它们只是同名,本质上不是同一个变量,不存在“重复赋值”的情况。比如调用countup(5)时,会依次生成countup(5)、countup(4)、countup(3)...各自的上下文,每个上下文里的countArray互不干扰。

疑问二:传入参数5时的执行流程

我们一步步拆解整个调用链:

  1. 调用countup(5):n=5不满足n<1,执行const countArray = countup(4),进入下一层递归。
  2. 调用countup(4):n=4不满足条件,执行const countArray = countup(3),继续递归。
  3. 调用countup(3):n=3不满足条件,执行const countArray = countup(2),继续递归。
  4. 调用countup(2):n=2不满足条件,执行const countArray = countup(1),继续递归。
  5. 调用countup(1):n=1不满足条件,执行const countArray = countup(0),继续递归。
  6. 调用countup(0):n=0满足n<1,直接返回空数组[]。
  7. 回到countup(1)的上下文:countArray被赋值为[],执行countArray.push(1),数组变为[1],返回该数组。
  8. 回到countup(2)的上下文:countArray被赋值为[1],执行push(2),数组变为[1,2],返回。
  9. 回到countup(3)的上下文:countArray被赋值为[1,2],执行push(3),数组变为[1,2,3],返回。
  10. 回到countup(4)的上下文:countArray被赋值为[1,2,3],执行push(4),数组变为[1,2,3,4],返回。
  11. 回到countup(5)的上下文:countArray被赋值为[1,2,3,4],执行push(5),数组变为[1,2,3,4,5],最终返回这个数组。

整个过程是先“递”到基线条件(n=0),再“归”回来依次执行push操作,最终生成结果数组。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 04:05:08