web-dev-qa-db-ja.com

JavaScriptの末尾呼び出しの関数は最適化されていますか?

JavaScriptのコンテキストで_Tail call optimization_を理解しようとしており、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_バージョンがJavaScriptコンパイラーによってScalaなどのような他の言語で行われるように最適化されるかどうかはわかりません。 ?

47
Aditya Singh

更新:2018年3月13日現在、Safariはテールコールの最適化をサポートする唯一のブラウザです。

クロムチームは、テールコールの最適化は積極的に開発されておらず、追跡できることを明示的に述べています here

Firefoxの実装を追跡できます here

オリジナルポスト

はい、ES2015は厳格モードでテールコールの最適化を提供します。アクセル・ラウシュマイヤー博士は、下のリンクでそれを美しくレイアウトしているので、ここで彼の言葉を繰り返さない。

注:ES 5はテールコールを最適化しません。

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

35
sheeldotme

理論的にははい。他の答えの状態として。

しかし実際には、2017年7月の時点で、いいえ。Safariのみがサポートしています。

Javascript ES6(ES2015)の互換性: https://kangax.github.io/compat-table/es6/

12
AK_