it-swarm.com.de

Sind die Funktionen im JavaScript-Tail-Call optimiert?

Ich habe versucht, Tail call optimization Im Kontext von JavaScript zu verstehen, und habe die folgenden rekursiven und Schwanz-rekursiven Methoden für factorial() geschrieben.

rekursiv:

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

Schwanz-rekursiv:

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

  return fact(n, 1)
}

Ich bin mir aber nicht sicher, ob die tail-recursive - Version der Funktion durch den JavaScript-Compiler optimiert wird, wie es in anderen Sprachen wie Scala usw. geschieht. Kann mir jemand dabei helfen? eins?

47
Aditya Singh

Update: Ab dem 13. März 2018 unterstützt Safari als einziger Browser die Tail-Call-Optimierung.

Das Chromium-Team gibt ausdrücklich an, dass die Schwanzrufoptimierung nicht in der aktiven Entwicklung ist und nachverfolgt werden kann hier .

Die Implementierung für Firefox kann verfolgt werden hier

Originalbeitrag

Ja, ES2015 bietet eine Tail-Call-Optimierung im Strict-Modus. Dr. Axel Rauschmayer legt es unter dem folgenden Link schön aus, damit ich seine Worte hier nicht wiederhole.

Hinweis: ES 5 optimiert keine Tail Calls.

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

35
sheeldotme

Theoretisch ja. Wie die andere Antwort sagt.

In der Praxis wird dies jedoch ab Juli 2017 nur von Safari unterstützt.

Kompatibilität mit Javascript ES6 (ES2015): https://kangax.github.io/compat-table/es6/

12
AK_