微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决JavaScript 函数调用子表达式可以是尾调用吗?

考虑以下返回语句:

return f() || g();

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

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

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

解决方法

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

根据standardg()处于尾部位置:

逻辑或表达式:逻辑或表达式 ||逻辑与表达式

返回带有参数调用的 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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。