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时的执行流程
我们一步步拆解整个调用链:
- 调用
countup(5):n=5不满足n<1,执行const countArray = countup(4),进入下一层递归。 - 调用
countup(4):n=4不满足条件,执行const countArray = countup(3),继续递归。 - 调用
countup(3):n=3不满足条件,执行const countArray = countup(2),继续递归。 - 调用
countup(2):n=2不满足条件,执行const countArray = countup(1),继续递归。 - 调用
countup(1):n=1不满足条件,执行const countArray = countup(0),继续递归。 - 调用
countup(0):n=0满足n<1,直接返回空数组[]。 - 回到
countup(1)的上下文:countArray被赋值为[],执行countArray.push(1),数组变为[1],返回该数组。 - 回到
countup(2)的上下文:countArray被赋值为[1],执行push(2),数组变为[1,2],返回。 - 回到
countup(3)的上下文:countArray被赋值为[1,2],执行push(3),数组变为[1,2,3],返回。 - 回到
countup(4)的上下文:countArray被赋值为[1,2,3],执行push(4),数组变为[1,2,3,4],返回。 - 回到
countup(5)的上下文:countArray被赋值为[1,2,3,4],执行push(5),数组变为[1,2,3,4,5],最终返回这个数组。
整个过程是先“递”到基线条件(n=0),再“归”回来依次执行push操作,最终生成结果数组。
内容的提问来源于stack exchange,提问作者Mario Garcia
相关产品推荐
相关产品推荐

