任何Javascript引擎尾部调用优化?

我有一个我已经在Javascript中实现的尾recursion寻路algorithm,并想知道是否有任何(所有?)浏览器可能会得到堆栈溢出exception。

ECMAScript 4规范最初是为了增加对TCO的支持,但是却被放弃了。

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

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

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

本质上,使用累加器模式可以达到相同的效果。

没有喜悦的一刻,但谢天谢地,正确的尾调用是和谐(ECMAScript版本6) http://wiki.ecmascript.org/doku.php?id=harmony:proper_tail_calls

几乎所有你遇到的浏览器都会“太多recursion”。 这是V8 bug追踪器中的一个入口,可能是有趣的阅读。

如果它是简单的自recursion,则可能值得使用显式迭代而不是希望消除尾部消息。

尾部调用优化将被支持在未来的ECMAScript 6严格模式中。 详情请查阅http://www.2ality.com/2015/06/tail-call-optimization.html

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

目前(26-01-2017)以下引擎支持尾部呼叫优化:

  • Safari 10
  • iOS 10
  • Kinoma XS6

支持如果“实验JavaScriptfunction” – 标志打开:

  • Chrome 54
  • 歌剧41
  • 节点6.5

尾巴调用优化现在在编译为JavaScript的LispyScript中可用。 你可以在这里阅读更多。

目前没有JS实现可以识别尾recursion。 正如其他人所说,ECMAScript 6中正在进行更改,V8上有一个打开的票据

在这里你可以看到V8生成的尾部recursion函数的汇编程序

https://gist.github.com/mcfedr/832e3553964a014621d5

比较一下,如何铿锵编译相同的function在C中

https://gist.github.com/mcfedr/63ad08370d856bad3694

V8保留了recursion调用,而C编译器已经识别了尾recursion,并将其改为循环