加载中...

尾调用指函数的最后一步操作是调用另一个函数并直接返回其结果。尾调用优化(Tail Call Optimization,TCO)是指引擎在这种情况下不再新增调用栈帧,而是复用当前帧,使得尾递归可以像循环一样以常量栈空间运行,深度递归不会栈溢出。
ECMAScript 2015 规范正式要求严格模式下实现"适当尾调用"(Proper Tail Calls),这在语言标准中相当罕见。然而现实是:只有 Apple 的 JavaScriptCore(Safari)完整实现;V8 曾实现后又移除,Chrome 与 Firefox 均以调试体验受损(调用栈信息丢失)和隐式行为难以察觉为由拒绝跟进,替代提案"显式尾调用语法"也未获推进。这成为 JS 标准与实现分裂的著名案例。
由于跨引擎不可依赖,JavaScript 中的深递归通常改写为循环、显式栈或蹦床函数(trampoline)。
TCO 之争反映了函数式编程理想与工程可调试性之间的取舍,也是理解"规范不等于现实"的典型教材。

登录 后参与讨论
暂无讨论,来发表第一条评论吧