JavaScript 什么是尾叫优化(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()to的调用b()在函数的尾部,a()因此不需要将a()状态压入帧堆栈。当b(0)返回而不是返回时a(),将直接返回到全局框架。通过消除中间步骤进一步优化。

TCO允许递归函数具有不确定的递归,因为帧堆栈不会随每个递归调用而增长。没有TCO递归功能的递归深度有限。

注意TCO是javascript引擎实现功能,如果浏览器不支持,则无法通过编译器实现。规范中没有实现TCO所需的其他语法,因此担心TCO可能会破坏网络。向世人发布它是谨慎的,可能需要为可预见的未来设置浏览器/引擎特定的标志。