尾调用
约 414 字大约 1 分钟
2026-04-01
思考
尾调用是什么?
尾调用有什么作用?
尾调用是什么?
尾调用是指在一个函数中,最后一步操作是调用另一个函数或自身,并且该调用的返回值直接作为当前函数的返回值,不再进行额外的计算。
// 尾调用
function f(x) {
// 尾调用:最后一步直接是调用 g(),并返回其结果
return g(x);
// 非尾调用
return x + g(x);
}尾调用有什么作用?
尾调用本身只是一种代码写法,它真正的巨大好处来自于编译器或解释器对它的优化。 在 ES6 中,符合特定条件(严格模式、特定引擎)的尾调用会自动进行尾调用优化。
节省内存空间
- 普通调用: 每次函数调用,系统都会在调用栈 (Call Stack) 中压入一个新的栈帧,用来保存局部变量、返回地址等信息。如果递归层数很深,栈帧会累积很多,占用大量内存。
- 尾调用: 既然当前函数在调用结束后不再需要做任何事,编译器可以复用当前的栈帧来执行下一个函数调用,而不是压入新栈帧。
防止栈溢出
由于尾调用优化后不新增栈帧,理论上可以进行无限次的递归调用而不会导致“栈溢出”错误。这使得递归可以安全地替代循环来处理某些逻辑。
性能提升
减少了压栈和出栈的操作开销。