我遇到了这段代码的问题:
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
正在控制台上打印。
返回语句后执行值再次变为正数。 为什么会这样?
答案 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
当它自称时,它当然会做同样的事情。所以:
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);
时,函数将继续按原样执行,直到它到达结尾。