我有一个简单的功能:
const stackOverflow = (n = 0) =>
n === 10000 ? 'cool' : stackOverflow(n + 1)
https://jsfiddle.net/dsso9pg6/
当我运行此操作时,我遇到"超出最大调用堆栈大小" 错误。我已经读过这些类型的递归函数可以用不同的方式编写,以避免在调用堆栈中出现这个问题(与#34;尾调用优化" ...有关),但我没有&#39我很清楚问题所在。
如何在避免错误的同时保留同样的递归函数结构?
编辑:或者这已经是尾调优化? (我在Node.js 8.6和Chrome 61中看到了错误,但Safari 11并没有抱怨并返回"很酷。")
答案 0 :(得分:2)
你做对了,程序编程中的while循环可以用函数式编程范例中的递归代替。因此,一种称为"尾调用优化的技术"是在一些函数式编程语言(例如Haskell)中发明的,用于处理这些场景中的长调用栈。
javascript中的最大调用堆栈还取决于运行时环境:例如,在我的浏览器中它是30000,但这可能会有所不同。所以你的代码在我的浏览器中工作正常,而不是抛出错误。但是这个想法是有一个上限,尾调优化可以消除它。
然而,尾部调用优化是语言引擎级别支持的功能,并且在后台运行而不是我们可以使用的功能。不幸的是,javascript并不是真正的FP语言,所以它还不支持这个功能。希望,当ES6最终确定时,我们可以拥有这个很酷的功能并完全使用函数式编程。
编辑:您可以在这里检查您的运行时环境是否支持TCO(看起来Safari已经支持它)