上面的代码该如何理解?
foo(3)
输出begin:3
执行foo(2)
输出begin:2
执行foo(1)
输出begin:1
执行foo(0)
输出begin:0
执行foo(-1)
i<0
返回
返回到执行完foo(0) 输出end:0
返回到执行完foo(1) 输出end:1
返回到执行完foo(2) 输出end:2
返回到执行完foo(3) 输出end:3
递归
10 回答11.2k 阅读
6 回答3k 阅读
5 回答4.8k 阅读✓ 已解决
4 回答3.1k 阅读✓ 已解决
2 回答2.7k 阅读✓ 已解决
3 回答2.3k 阅读✓ 已解决
3 回答2.1k 阅读✓ 已解决
前提知识:
在函数内部调用另外一个函数,会在该函数上方形成一个call frame,用于保存变量和相关调用位置,其实理解MDN上的这个场景,只要理解上面这个图就可以了(图画的简单了一些,ascii画出来的,有点虐~)
这里的N个call frame就形成了调用栈,即call stack
何时销毁:
那么,这个call frame什么时候销毁?就是当上层frame执行到return的时候。
这个时候上层frame将结果返回给下层,下层继续执行,执行完后return到下面的frame,然后销毁。
依次类推。
破题:
所以,当f(-1)执行到return的时候,他下方的f(0) frame保存的i的值为0,然后从document.writeln这里继续往下执行。