尾调用优化(TCO)在JavaScript规范中存在但支持有限:仅Safari的JavaScriptCore在严格模式下完全实现,V8和SpiderMonkey已放弃支持;尾调用指函数最后动作是调用另一函数且其返回值直接作为当前函数返回值。
JavaScript 的尾调用优化(Tail Call Optimization,TCO)在语言规范中确实存在,但实际支持非常有限——目前只有 Safari 浏览器的 JavaScriptCore 引擎在严格模式下完全实现了 TCO,而 V8(Chrome/Node.js)和 SpiderMonkey(Firefox)均已明确放弃支持。
尾调用指函数的最后一个动作是调用另一个函数(包括自身),且该调用的返回值直接作为当前函数的返回值,不参与后续计算。例如:
function factorial(n, acc = 1) {
if (n <= 1) return acc;
return factorial(n - 1, n * acc); // 尾调用:没有其他运算,直接返回
}
function foo() {
return bar(); // 尾调用
}
function baz() {
return bar() + 1; // 不是尾调用:需对 bar() 结果再加 1
}
transform-regenerator 和 proposal-tailcall-optimization 插件,但因引擎不支持,现代构建链基本不再维护。
环境中仍会正常增长调用栈,可能触发 RangeError。基本上就这些。尾调用优化在规范里很优雅,现实中却几乎不可用。写递归时,默认按普通调用处理,优先考虑循环或迭代方案更稳妥。