我有一个用 JavaScript 实现的尾递归寻路算法,想知道是否有任何(全部?)浏览器可能会出现堆栈溢出异常。
ECMAScript 4 规范原本打算加入对 TCO 的支持,但被放弃了:
截至 2010 年,目前没有广泛可用的 JavaScript 实现自动执行 TCO。
查看最新更新的评论。
暂时不高兴,但值得庆幸的是,为 Harmony(ECMAScript 版本 6)准备了适当的尾调用 http://wiki.ecmascript.org/doku.php?id=harmony:proper_tail_calls
未来ECMAScript 6严格模式将支持尾调用优化。查看http://www.2ality.com/2015/06/tail-call-optimization.html了解详情。
检查 http://kangax.github.io/compat-table/es6/ 当前引擎支持。
目前(18-07-2019)以下引擎支持尾调用优化:
如果打开“实验性 JavaScript 功能”-flag 则支持:
几乎所有你遇到的浏览器都会厌恶“过多的递归”。这是 V8 错误跟踪器中的条目,阅读起来可能会很有趣。
如果它是简单的自递归,那么使用显式迭代而不是希望消除尾调用可能是值得的。
尾调用优化现在可用于编译为 JavaScript 的 LispyScript。你可以阅读更多关于它这里.
目前没有 JavaScript 实现可以识别尾递归。 ECMAScript 6 正在发生变化,正如其他人所说,V8 上有一张公开票。
在这里你可以看到 V8 为尾递归函数生成的汇编器:
将其与 Clang 在 C 中编译相同函数的方式进行比较
V8 保留了递归调用,而 C 编译器已经识别出尾递归并将其更改为循环。