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

Can JavaScript function call subexpressions be tail calls?

考虑以下 return 语句:

return f() || g();

调用 f() 显然不是尾调用,因为如果 f() 是假的,函数实际上不会 return。

但是 g() 部分呢,那是尾调用吗?或者我必须像这样重写它:

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

Try it and see?

出于某种原因,我在睡眠不足的状态下并没有想到 :D

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

f()

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

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

根据standardg()在尾部位置:

LogicalORExpression : LogicalORExpression || LogicalANDExpression

Return HasCallInTailPosition of LogicalANDExpression with argument call.

但是,大多数浏览器 don't support 尾调用消除,而 Chromium 团队并未在这方面进行工作,因此无论您如何编写尾调用,在实践中都不能依赖尾调用消除。