阅读Rauschmayer 博士对 es6 中递归尾调用优化的描述后,我一直在尝试重新创建他详细介绍的递归阶乘函数的“零堆栈”执行。
使用 Chrome 调试器在堆栈帧之间步进,我看到尾部优化没有发生,并且正在为每次递归创建一个堆栈帧。
我还尝试通过在没有调试器的情况下调用函数来测试优化,而是传递100000
给阶乘函数。这会引发“最大堆栈”错误,这意味着它实际上并未优化。
这是我的代码:
const factorial = (n, acc = 1) => n <= 1 ? acc : factorial(n - 1, n * acc)
console.log( factorial(100000) )
结果:
Uncaught RangeError: Maximum call stack size exceeded