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
。
是的,但在实践中没有帮助。
根据standard,g()
在尾部位置:
LogicalORExpression : LogicalORExpression || LogicalANDExpression
Return HasCallInTailPosition of LogicalANDExpression with argument call.
但是,大多数浏览器 don't support 尾调用消除,而 Chromium 团队并未在这方面进行工作,因此无论您如何编写尾调用,在实践中都不能依赖尾调用消除。
考虑以下 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
。
是的,但在实践中没有帮助。
根据standard,g()
在尾部位置:
LogicalORExpression : LogicalORExpression || LogicalANDExpression
Return HasCallInTailPosition of LogicalANDExpression with argument call.
但是,大多数浏览器 don't support 尾调用消除,而 Chromium 团队并未在这方面进行工作,因此无论您如何编写尾调用,在实践中都不能依赖尾调用消除。