You need to enable JavaScript to run this app. JS递归代码执行流程、输出结果及参数取值异常问题咨询
优惠活动
大模型
产品
解决方案
定价
更多

JS递归代码执行流程、输出结果及参数取值异常问题咨询

问题1:代码执行逻辑

这段代码是典型的递归调用逻辑,JS是单线程执行,遵循调用栈后进先出的规则,执行流程如下:

  1. 初始调用one(9),n=9不等于1,n自减为8,打印8,接下来要执行two(one(8), one(8)),需要先把两个参数的返回值算出来再传入two
  2. 先算第一个参数one(8):n=8不等于1,自减为7,打印7,接下来要执行two(one(7), one(7)),继续先算第一个参数one(7)
  3. 这个递归过程会持续到调用one(1):此时触发n==1的判断,直接空返回,JS中函数没有指定返回值时默认返回undefined
  4. 当最内层的one(1)返回undefined后,就会开始计算同层级two的第二个参数,也就是另一个one(1),同样返回undefined
  5. 两个参数都计算完成后,调用two(undefined, undefined),打印两个undefined,而two本身也没有返回值,所以上一层的one调用的返回值也是undefined,再往上逐层执行完所有递归分支的第二个参数和对应的two调用。
    整体的打印顺序就是先连续打印8、7、6、5、4、3、2、1(这是最左侧递归分支的n--打印),然后开始逐层打印两个undefined,再打印右侧分支的n递减值,再打印undefined,以此类推,是典型的二叉树递归前序遍历的输出顺序。

问题2:两个one(n)参数的执行顺序

JS中函数参数遵循从左到右依次串行求值的规则,单线程环境下不存在同时运行的情况,一定会先把第一个one(n)完整执行完毕、拿到返回值之后,才会开始执行第二个one(n)。

问题3:two输出为undefined的原因

原因非常直接:

  • one函数所有分支的返回值都是undefined:要么是n==1时的空return,要么是return two()的执行结果
  • 而two函数本身没有写return语句,执行完默认返回undefined
    所以不管递归多少层,one函数的返回值永远是undefined,传入two的两个参数自然都是undefined,输出也就都是undefined了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.14 18:27:03