尾调用优化(Tail Call Optimization, TCO)。
简单地说,尾调用就是一个出现在另一个函数“结尾”处的函数调用。这个调用结束后就没有其余事情要做了(除了可能要返回结果值)
调用一个新的函数需要额外的一块预留内存来管理调用栈,称为栈帧。
有一点很重要,需要注意:TCO只用于有实际的尾调用的情况。如果你写了一个没有尾调用的递归函数,那么性能还是会回到普通栈帧分配的情形,引擎对这样的递归调用栈的限制也仍然有效。很多递归函数都可以改写,就像刚刚展示的factorial(..)那样,但是需要认真注意细节。
阶乘函数
fuction factorial(n){
if(n<2) return 1;
return n*factorial(n-1)
}
尾调优化后的阶乘函数
function factorial(n){
function fact(n,res){
if(n<2) return res;
return fact(n-1,n*res)
}
return fact(n,1)
}