返回语句执行后无法理解流程

时间:2016-11-14 17:17:17

标签: javascript recursion

我遇到了这段代码的问题:

function foo(i) {

  if (i < 0) {

    return;
  }
  console.log('begin:' + i);
  foo(i - 1);
  console.log('end:' + i);
}
foo(2);

begin:2
begin:1
begin:0
end:0
end:1
end:2
>>undefined

不确定原因

end:0  
end:1
end:2

正在控制台上打印。

返回语句后执行值再次变为正数。 为什么会这样?

4 个答案:

答案 0 :(得分:7)

让我们走过去。

foo(2);
 // logs out begin: 2;
 // calls foo(1);
    // logs out begin: 1;
    // calls foo(0);
       // logs out begin: 0;
       // calls foo(-1);
          // pop up
       // logs out end: 0;
       // pop up
    // logs out end: 1;
    // pop up
 // logs out end: 2;

答案 1 :(得分:2)

你看到了这个,因为foo正在呼唤自己。所以foo

  • 输出“begin:”行
  • 自称
  • 输出“end:”行

当它自称时,它当然会做同样的事情。所以:

foo(2) outputs "begin:2"
foo(2) calls foo(1):
    foo(1) outputs "begin:1"
    foo(1) calls foo(0)
        foo(0) outputs "begin:0"
        foo(0) calls foo(-1)
            foo(-1) returns before printing anything
        foo(0) outputs "end:0"
        foo(0) returns
    foo(1) outputs "end:1"
    foo(1) returns
foo(2) outputs "end:2"
foo(2) returns

答案 2 :(得分:0)

退回时的函数调用将从中断处继续。在代码中的每种情况下,它都会在打印end语句之前停止。因此,退出时的每个函数调用都将继续打印结束语句。

答案 3 :(得分:0)

因为这就是递归函数调用的工作原理。

您有以下代码段:

console.log('begin:' + i);
foo(i - 1);
console.log('end:' + i);`

在这种情况下,最后一行不会被忽略,因为该函数之前执行了另一次调用。每次都会将console.log('end:' + i);添加到调用堆栈中,因此当完成递归函数调用foo(i - 1);时,函数将继续按原样执行,直到它到达结尾。