是否对JavaScript引擎尾部调用(TCO)进行了优化?
我有一个用JavaScript实现的尾部递归寻路算法,我想知道是否有(所有?)浏览器可能会出现堆栈溢出异常。几乎所有遇到的浏览器都会对“太多递归”感到厌烦。这是一本可能会很有趣的书是否对JavaScript引擎尾部调用(TCO)进行了优化?,javascript,functional-programming,tail-recursion,Javascript,Functional Programming,Tail Recursion,我有一个用JavaScript实现的尾部递归寻路算法,我想知道是否有(所有?)浏览器可能会出现堆栈溢出异常。几乎所有遇到的浏览器都会对“太多递归”感到厌烦。这是一本可能会很有趣的书 如果是简单的自递归,那么使用显式迭代可能是值得的,而不是希望消除尾部调用。ECMAScript 4规范最初打算增加对TCO的支持,但后来被放弃了: 据我所知,目前还没有广泛使用的JavaScript实现能够自动实现TCO。不过,这可能对您有用: 本质上,使用累加器模式也可以达到同样的效果。暂时没有什么乐趣,但谢天
如果是简单的自递归,那么使用显式迭代可能是值得的,而不是希望消除尾部调用。ECMAScript 4规范最初打算增加对TCO的支持,但后来被放弃了:
据我所知,目前还没有广泛使用的JavaScript实现能够自动实现TCO。不过,这可能对您有用:
本质上,使用累加器模式也可以达到同样的效果。暂时没有什么乐趣,但谢天谢地,为Harmony(ECMAScript版本6)安排了适当的尾部调用
尾部调用优化现在可以在其中编译为JavaScript。您可以阅读更多有关它的信息。目前没有JavaScript实现识别尾部递归。改革正在进行中,正如其他人所说,这是一个开放的门票 在这里,您可以看到V8为尾部递归函数生成的汇编程序: 将其与在C中编译相同函数的方式进行比较
V8保留递归调用,而C编译器已识别尾部递归并将其更改为循环。将来ECMAScript 6严格模式将支持尾部调用优化。查看详细信息 检查当前的发动机支架 目前(2019年7月18日),以下发动机支持尾部呼叫优化:
- 狩猎>=10
- iOS>=10
- 基诺马XS6
- Duktape 2.3
- 节点6.5
- Chrome 54/Opera 41当前版本的compat表不再列出它