JavaScript函数调用子表达式可以是尾部调用吗?



考虑以下返回语句:

return f() || g();

调用f()显然不是尾部调用,因为如果f()为false,函数实际上并不返回。

关于g()部分,那是一个尾巴呼叫吗?或者我必须这样重写:

const temp = f();
if (temp) return temp; else return g();

是的,但是在实践中没有帮助。

根据标准,g()在尾部位置:

logicaloreexpression: logicaloreexpression || LogicalANDExpression

返回带有参数调用的LogicalANDExpression的HasCallInTailPosition

然而,大多数浏览器不支持尾部调用消除,而且Chromium团队也不支持它,所以无论你如何编写尾部调用,你都不能在实践中依赖尾部调用消除。

试试看?

由于某种原因,我在睡眠不足的状态下没有想到这一点:D

function f() {
return Math.random() > 1 || f();
}
f()

Node显示RangeError: Maximum call stack size exceeded, Firefox显示InternalError: too much recursion

最新更新