JavaScript尾部调用中的函数是否已优化?

阿迪亚·辛格(Aditya Singh):

我一直试图Tail call optimization在JavaScript上下文中进行理解,并为编写了以下递归和尾递归方法factorial()

递归:

function factorial (n) {
  if (n < 2) {
    return 1;
  } else {
    return n * factorial(n-1);
  }
}

尾递归:

function factorial (n) {
  function fact(n, acc) {
    if (n < 2) {
      return acc;
    } else {
      return fact(n-1, n * acc);
    }
  }

  return fact(n, 1)
}

但是我不确定tail-recursive该函数版本是否会像其他Scala等语言一样通过JavaScript编译器进行优化。有人可以帮我解决这个问题吗?

sheeldotme:

更新:自2020年1月1日起,Safari是唯一支持尾叫优化的浏览器。

铬小组明确指出尾声调用优化尚未积极开展,可以在这里进行跟踪

可以在这里跟踪Firefox的实现

原始帖子

是的,ES2015在严格模式下提供了尾部呼叫优化。Axel Rauschmayer博士在下面的链接中给出了漂亮的布局,因此在此我不再赘述。

注意:ES 5不会优化尾调用。

http://www.2ality.com/2015/06/tail-call-optimization.html

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Javascript引擎中的尾部调用优化实现

Node.js:异步函数中是否对尾部调用进行了优化?

Go递归函数调用是否优化了尾部?

是否对JavaScript引擎尾部调用(TCO)进行了优化?

JavaScript函数调用中的尾部逗号

JVM是否阻止尾部调用优化?

Java是否支持并优化尾部递归调用?

尾部调用优化是否适用于此功能?

Java 8是否具有尾部调用优化功能?

为什么没有JavaScript引擎支持尾部调用优化?

绑定函数是否支持ES6中适当的尾部调用?

如何记录返回函数调用的函数(用于优化尾部调用)

尾部调用优化是否适用于除递归调用以外的其他调用?

JavaScript / Mocha-如何测试是否已等待函数调用

如何检查Rust中是否已调用函数?

用于确定函数调用中是否已给出值的方法

如何确定在Powershell中是否已调用函数

F#是否使用|> Option.bind执行TCO(尾部调用优化)

Swift是否实现尾部调用优化?在相互递归的情况下?

ML系列编译器是否对尾部调用进行了任何复杂的优化?

(前向)管道运算符可以/是否可以阻止尾部调用优化?

函数调用是否替换为 javascript 中的函数定义?

如何检查函数是否已调用

为什么此尾部调用优化函数会失败,并导致最大调用堆栈大小超出错误?

构造函数的初始化列表中的函数调用是否已排序?

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

在Agda中启用尾部呼叫优化

Scala是否在链接函数中执行优化?

是否可以在Rust中优化空函数?