函数式编程之尾调用

title

尾调用,就是在函数的最后一步调用另一个函数

1
2
3
function foo(x) {
return g(x);
}

尾调用不一定出现在函数尾部,只要是最后一步操作就行

1
2
3
4
5
6
function f(x) {
if (x > 0) {
return m(x)
}
return n(x);
}

函数m和n都属于尾调用,他们都是函数的最后一步操作

尾调用优化

函数调用会在内存形成一个’调用记录‘,保存调用位置和内部变量等信息,如果在A函数中调用B函数,在A函数的调用记录上还会形成一个B的调用记录,等到B函数运行结束后,把结果返回到A,B的调用记录才会消失。如果函数B内部还调用C函数,那就是还有一个C的调用记录栈,以此类推,所有的调用记录,就会形成一个’调用栈‘。

尾调用在于它特殊的调用位置。由于是函数最后一步操作,所以不需要保留外层函数的调用记录,因为调用位置和内部变量都不会再用到了。

’尾调用优化‘,只调用内层函数的调用记录。如果所有函数都是尾调用,那么完全可以做到每次执行时,调用记录只有一项,这将大大节省内存。