JavaScript 问题中的递归 - console.log 的位置如何影响返回值的顺序?

Recursion in JavaScript question- how is the position of console.log here affecting the order in which values are returned?

我是编程新手,也是第一次学习基本递归。我刚刚在 JavaScript 中练习题的结果真的让我很吃力 面条。

function countDownRecursive(n) {
   if (n == 0) {
     console.log('Hooray!')
     return
     } else {
       console.log(n)
       countDownRecursive(n-1)
       console.log(n)               
     }
}

即 countDownRecursive(3) 的输出是

3 2 1 Hooray! 1 2 3

我的问题是为什么像这样在 countDownRecursive(n-1) 之后放置 console.log() 会导致 JS 反向记录值?

在初始调用中,输入 else,并且

   console.log(n)
   countDownRecursive(n-1)

3 已记录。然后,初始 countDownRecursive(3) 函数在调用 countDownRecursive(3-1) 时被挂起。堆栈现在由 countDownRecursive(3).

组成

同样的事情发生在 countDownRecursive(2)。 2 被记录,并且通过 its 递归调用,堆栈现在由 countDownRecursive(2)countDownRecursive(3).

组成

等等。最后,countDownRecursive(0),堆栈是

countDownRecursive(0) <-- current function
countDownRecursive(1)
countDownRecursive(2)
countDownRecursive(3)

3 2 1 已被记录。

在 0 时,不再有递归,所以有 Hooray。最里面的 countDownRecursive(0) 结束,然后 countDownRecursive(1) 在递归调用点恢复:

   countDownRecursive(1-1) // this line just finished
   console.log(1)    

所以 1 被记录,该函数结束。

函数不断恢复、记录和退出,直到堆栈为空,您剩下的日志为

3
2
1
Hooray!
1
2
3