考虑以下返回语句:
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
。