问题描述
考虑以下返回语句:
return f() || g();
调用 f()
显然不是尾调用,因为如果 f()
为假,函数实际上不会返回。
那么 g()
部分呢,那是尾调用吗?还是我必须像这样重写它:
const temp = f();
if (temp) return temp; else return g();
解决方法
是的,但在实践中没有帮助。
根据standard,g()
处于尾部位置:
逻辑或表达式:逻辑或表达式 ||逻辑与表达式
返回带有参数调用的 LogicalANDExpression 的 HasCallInTailPosition。
但是,大多数浏览器都don't support 消除了尾调用,而 Chromium 团队并未致力于此,因此无论您如何编写尾调用,都不能在实践中依赖尾调用消除。
> ,试试看?
出于某种原因,我在睡眠不足的状态下没有发生这种情况:D
function f() {
return Math.random() > 1 || f();
}
f()
节点表示 RangeError: Maximum call stack size exceeded
,Firefox 表示 InternalError: too much recursion
。