尾调用 : 指函数最后一步调用另一个函数;
- 为什么要用尾调用?尾调用优化代码的意义在哪里。
函数在调用的时候会在调用栈(call stack)中存有一条记录,每一条记录叫做一个调用帧(call frame),每调用一个函数,就向栈中push一条记录,函数执行结束后依次向外弹出,直到清空调用栈。function a() { console.log('如果有帮助请点个赞,大兄弟'); } function b() { a() } function c() { b() } c();
造成这样的结果是因为每个函数在调用另一个函数的时候,没有return该调用,所以执行引擎会认为你还没有调用完毕,会保留调用帧。
而如果使用尾调用优化,调用帧就永远只有一条,这个时候就会节省很大一部分的内存空间,维护了代码运行的流畅性。
function a() {
console.log('如果有帮助请点个赞,大兄弟');
}
function b() {
return a()
}
function c() {
return b()
}
c();
以上代码就叫做尾调用优化,这个时候调用帧就永远只有一条,节省了部分内存。
尾递归
函数调用自身,称为递归。如果尾调用自身,就称为尾递归。
递归非常耗费内存,因为需要同时保存成千上百个调用帧,很容易发生“栈溢出”错误(stack overflow)。但对于尾递归来说,由于只存在一个调用帧,所以永远不会发生“栈溢出”错误。
- 计算一个数的阶乘,使用尾递归调用的优化
function multiplication(n) { if (n === 1) return 1; return n * multiplication(n - 1) } multiplication(4)//24 //尾递归 function multiplication1(n,init){ if(n === 1)return init; return multiplication1(n -1 ,n*init) } multiplication(4,1)//24 //优化 function multiplication2(n,init=1){ if(n === 1)return init; return multiplication2(n -1 ,n*init) } multiplication2(4);//24