JS递归代码执行流程、输出结果及参数取值异常问题咨询
问题1:代码执行逻辑
这段代码是典型的递归调用逻辑,JS是单线程执行,遵循调用栈后进先出的规则,执行流程如下:
- 初始调用
one(9),n=9不等于1,n自减为8,打印8,接下来要执行two(one(8), one(8)),需要先把两个参数的返回值算出来再传入two - 先算第一个参数
one(8):n=8不等于1,自减为7,打印7,接下来要执行two(one(7), one(7)),继续先算第一个参数one(7) - 这个递归过程会持续到调用
one(1):此时触发n==1的判断,直接空返回,JS中函数没有指定返回值时默认返回undefined - 当最内层的
one(1)返回undefined后,就会开始计算同层级two的第二个参数,也就是另一个one(1),同样返回undefined - 两个参数都计算完成后,调用
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,要么是returntwo()的执行结果- 而
two函数本身没有写return语句,执行完默认返回undefined
所以不管递归多少层,one函数的返回值永远是undefined,传入two的两个参数自然都是undefined,输出也就都是undefined了。
内容的提问来源于stack exchange,提问作者Abhijit Borkakoty
相关产品推荐
相关产品推荐

