是否优化了任何Javascript引擎尾调用?

clo*_*esh 90 javascript functional-programming tail-recursion

我有一个尾递归寻路算法,我已经在Javascript中实现,并想知道是否有任何(所有?)浏览器可能会得到堆栈溢出异常.

Tim*_*ter 47

ECMAScript 4规范最初将增加对TCO的支持,但它被删除了.

http://lambda-the-ultimate.org/node/3047

据我所知,目前没有广泛可用的JS实现自动TCO.不过,这可能对您有用:

http://www.paulbarry.com/articles/2009/08/30/tail-call-optimization

基本上,使用累加器模式可以实现相同的效果.

  • 累加器模式不能达到与TCO相同的效果.它只是将递归算法转换为尾递归形式.这是TCO成为可能的先决条件,但它不能替代它.你仍然会用一种不优化尾调用的语言来破坏堆栈. (39认同)
  • (对不起拖钓)ECMAScript 6包含TCO,在规范中称为Proper Tail Calls. (5认同)

Mr *_*ker 26

暂时没有欢乐,但幸运的是,正确的尾部调用是针对和谐的(ECMAScript版本6) http://wiki.ecmascript.org/doku.php?id=harmony:proper_tail_calls

  • @MarkWilbur据我所知,节点使用与chrome相同版本的v8 - 目前不支持TCO我对JS有一个要点,以及当前V8生成的优化汇编程序 - https://gist.github的.com/mcfedr/832e3553964a014621d5 (4认同)

Han*_*Gay 12

几乎你遇到的每一个浏览器都会"过多递归".这是V8 bug跟踪器中的一个条目,可能是有趣的阅读.

如果它是简单的自递归,那么使用显式迭代而不是希望消除尾部调用可能是值得的.


Sim*_*Zyx 12

将支持尾部调用优化ECMAScript 6严格模式.有关详细信息,请访问http://www.2ality.com/2015/06/tail-call-optimization.html.

检查http://kangax.github.io/compat-table/es6/以获取当前的引擎支持.

目前(05-01-2018),以下引擎支持尾调用优化:

  • Safari 10
  • iOS 10
  • Kinoma XS6

支持"实验性JavaScript功能"-flag打开:

  • 节点6.5
  • Chrome 54/Opera 41当前版本的compat表不再列出它