什么是尾部呼叫优化(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。它向世界的发布是谨慎的,并且可能需要为可感知的未来设置浏览器/引擎特定标志。