定义
函数的最后一步操作调用另一个函数
function f(x) {
return g(x)
}
// 以下不算尾调用
1) 赋值操作
function f(x) {
let y = g(x)
return y
}
2) 调用函数后,还有其它操作
function f(x) {
return g(x) + 1
}
3) 最后一步隐性调用 return undefind
function f(x) {
g(x)
}
实质
只保留内层函数的调用帧,不保留外层函数的调用帧,节省内存
注意
只有不需要用到外层函数的内部变量,才能取消外层函数的调用帧,否则不能进行尾调用优化。
function addOne(a) {
var one = 1;
function inner(b) {
return b + one
}
return inner(a)
}
不会进行尾调用优化,应为内层函数inner 用到了外层函数addOne 内部的变量one.