我正在阅读关于MDN上的函数的文章,我到达了Recursive部分,但我不明白最后一部分讨论了使用类似堆栈的行为。
例如:
function foo(i) {
if (i < 0)
return;
console.log('begin:' + i);
foo(i - 1);
console.log('end:' + i);
}
foo(3);
// Output:
// begin:3
// begin:2
// begin:1
// begin:0
// end:0
// end:1
// end:2
// end:3
在该函数上,我了解显示begin
日志的时间,但是当显示end
日志时我不知道。有人可以帮我解释一下吗?
答案 0 :(得分:3)
所以基本上每次调用foo时它都会i-1
它保持函数打开,它还没有返回。它继续运行因此,一旦它达到0,最后一个函数调用返回,它就会被调用。一旦发生这种情况,其他foo调用也可以开始完成。他们将从最古老到最新完成。
你可以通过Philip Roberts使用放大镜看到这个可视化。你的例子的Here is a Loupe。
答案 1 :(得分:2)
在每个end
被调用和处理后,foo(i - 1);
就会显示出来。
基本上这个过程是:
1)致电foo(i)
2)呼叫foo(i - 1)
n次;
然后,当i
到达-1
时:
3)最深的堆栈return
s
4)console.log('end:' + i)
n次,因为它仍然是函数调用的一部分,直到i
到达-1
;
答案 2 :(得分:2)
查看它的最佳方式可能是“展开”递归并将其写为连续调用序列:
foo(3);
begin:3
foo(2);
begin:2
foo(1);
begin:1
foo(0);
begin:0
foo(-1);
return;
end:0
end:1
end:2
end:3
'end:'字符串在到达最深递归后打印