JavaScript递归中console.log的位置如何影响输出值的顺序?
递归调用后倒序输出的原因
你遇到的这个现象本质是由JavaScript调用栈的后进先出特性决定的,我们可以一步步拆解countDownRecursive(3)的完整执行流程理解:
首先贴出你给出的代码方便对照:
function countDownRecursive(n) { if (n == 0) { console.log('Hooray!') return } else { console.log(n) countDownRecursive(n-1) console.log(n) } }
执行过程完全按以下顺序走:
- 第一步调用
countDownRecursive(3):进入else分支,先执行第一个console.log(n)输出3,接下来调用countDownRecursive(2),此时当前函数剩下的逻辑(递归调用后的console.log(n))会被挂起,必须等countDownRecursive(2)完全执行完毕才会继续运行。 - 进入
countDownRecursive(2):先输出2,再调用countDownRecursive(1),同样挂起后续的输出逻辑,等countDownRecursive(1)执行完。 - 进入
countDownRecursive(1):先输出1,再调用countDownRecursive(0),挂起后续输出逻辑,等countDownRecursive(0)执行完。 - 进入
countDownRecursive(0):满足n==0的终止条件,输出Hooray!后return退出,回到上一层countDownRecursive(1)的挂起位置。 - 继续执行
countDownRecursive(1)剩下的逻辑:输出n的值1,执行完毕退出,回到countDownRecursive(2)的挂起位置。 - 继续执行
countDownRecursive(2)剩下的逻辑:输出n的值2,执行完毕退出,回到countDownRecursive(3)的挂起位置。 - 继续执行
countDownRecursive(3)剩下的逻辑:输出n的值3,整个函数执行完成。
所以递归调用之后的代码,执行顺序和递归调用的顺序是反过来的,自然就会呈现倒序输出的效果。
内容的提问来源于stack exchange,提问作者TheGuntz
相关产品推荐
相关产品推荐

