原始 num2 如何在此斐波那契实例中更新?

How is the original num2 updated in this fibonacci instance?

我得到了一个代码实例,希望我能对其进行解释。

    function fib(num1, num2, stop) {
      var num3 = num1 + num2;
      console.log(num3);
      if(stop === 0) {
          return;
      }
      fib(num2, num3, stop - 1);
    }

fib(0, 1, 6)

虽然我似乎明白了所有这些,但我似乎无法理解参数 num2 是如何不断更新到下一个数字的。

谢谢!

P.S。这是我第一次 post 在 Whosebug 上,如果有人有任何关于如何改进这个 post 的提示。非常感谢。

how does the parameter num2 keeps being updated to the next number.

实际上 num2 永远不会更新。但是,fib 的每次递归执行都会引入一个具有相同名称的 new 变量。它从调用者那里获得它的价值。一旦它具有该值,它就永远不会改变。但是你得到的变量名称 num2 与对 fib.

的调用一样多

现在注意递归调用是如何进行的:

fib(num2, num3, stop - 1);

然后检查这些参数是如何收到的:

function fib(num1, num2, stop) {

注意调用者的num3,成为调用num2的初始值。这样在整个程序中给人的感觉是num2变化,但实际上每次发生“变化”时都是一个新变量,初始值总是[=17] =] 在调用执行上下文中。

可视化

下图中的每个“框”代表 fib 的单个执行上下文。它是一组局部变量的容器。在对函数进行更深入的调用时,这些保持不变,因为 that 将为一组新变量生成另一个上下文(容器):

fib(0, 1, 6)
+-------- new execution context ---------------------------------------------+
| // num1 = 0, num2 = 1, stop = 6                                            |
| var num3 = num1 + num2; // = 1                                             |
| fib(num2, num3, stop - 1);                                                 |
|     +------ new execution context ----------------------------------------+|
|     | // num1 = 1, num2 = 1, stop = 5                                     ||
|     | var num3 = num1 + num2; // = 2                                      ||
|     | fib(num2, num3, stop - 1);                                          ||
|     |     +------ new execution context ---------------------------------+||
|     |     | // num1 = 1, num2 = 2, stop = 4                              |||
|     |     | var num3 = num1 + num2; // = 3                               |||
|     |     | fib(num2, num3, stop - 1);                                   |||
|     |     |     +------ new execution context --------------------------+|||
|     |     |     | // num1 = 2, num2 = 3, stop = 3                       ||||
|     |     |     | var num3 = num1 + num2; // = 5                        ||||
|     |     |     | fib(num2, num3, stop - 1);                            ||||
|     |     |     |     +------ new execution context -------------------+||||
|     |     |     |     | // num1 = 3, num2 = 5, stop = 2                |||||
|     |     |     |     | var num3 = num1 + num2; // = 8                 |||||
|     |     |     |     | fib(num2, num3, stop - 1);                     |||||
|     |     |     |     |     +------ new execution context ------------+|||||
|     |     |     |     |     | // num1 = 5, num2 = 8, stop = 1         ||||||
|     |     |     |     |     | var num3 = num1 + num2; // = 13         ||||||
|     |     |     |     |     | fib(num2, num3, stop - 1);              ||||||
|     |     |     |     |     |     +------ new execution context -----+||||||
|     |     |     |     |     |     | // num1 = 8, num2 = 13, stop = 0 |||||||
|     |     |     |     |     |     +----------------------------------+||||||
|     |     |     |     |     +-----------------------------------------+|||||
|     |     |     |     +------------------------------------------------+||||
|     |     |     +-------------------------------------------------------+|||
|     |     +--------------------------------------------------------------+||
|     +---------------------------------------------------------------------+|
+----------------------------------------------------------------------------+