什么是尾部呼叫优化(TCO)
TCO 仅在严格模式下可用
一如既往地检查浏览器和 Javascript 实现是否支持任何语言功能,并且与任何 javascript 功能或语法一样,它可能在将来发生变化。
它提供了一种优化递归和深度嵌套函数调用的方法,它消除了将函数状态推送到全局帧堆栈的需要,并且通过直接返回初始调用函数来避免必须逐步执行每个调用函数。
function a(){
return b(); // 2
}
function b(){
return 1; // 3
}
a(); // 1
如果没有 TCO,对 a()
的调用会为该函数创建一个新框架。当该函数调用 b()
时,a()
的帧被推入帧堆栈并为函数 b()
创建一个新帧
当 b()
返回 a()
时,a()
的帧从帧堆栈中弹出。它立即返回到全局帧,因此不使用堆栈上的任何状态。
TCO 认识到从 a()
到 b()
的调用位于函数 a()
的尾部,因此不需要将 a()
的状态推到帧堆栈上。当 b(0)
返回而不是返回 a()
时,它直接返回到全局帧。通过消除中间步骤进一步优化。
TCO 允许递归函数具有无限递归,因为帧堆栈不会随着每次递归调用而增长。没有 TCO 递归函数具有有限的递归深度。
注意 TCO 是一个 javascript 引擎实现功能,如果浏览器不支持它,则无法通过转换器实现。实现 TCO 所需的规范中没有其他语法,因此担心 TCO 可能会破坏 Web。它向世界的发布是谨慎的,并且可能需要为可感知的未来设置浏览器/引擎特定标志。