web-dev-qa-db-fra.com

Les fonctions dans l'appel ultérieur de JavaScript sont-elles optimisées?

J'ai essayé de comprendre Tail call optimization Dans le contexte de JavaScript et j'ai écrit les méthodes ci-dessous récursives et récursives pour factorial().

Récursif:

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

queue-récursive:

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

  return fact(n, 1)
}

Mais je ne suis pas sûr que la version tail-recursive De la fonction soit optimisée par le compilateur JavaScript, comme c'est le cas dans d'autres langues comme Scala etc.). Quelqu'un peut-il m'aider à ce sujet? une?

47
Aditya Singh

Mise à jour: à compter du 13 mars 2018, Safari est le seul navigateur qui prend en charge l'optimisation des appels en aval.

L'équipe Chrome indique explicitement que l'optimisation d'appel final n'est pas en cours de développement et peut être suivie ici .

L’implémentation pour Firefox peut être suivie ici

Message original

Oui, ES2015 offre une optimisation des appels en aval en mode strict. Le Dr. Axel Rauschmayer l'exprime magnifiquement sur le lien ci-dessous, je ne répéterai donc pas ses mots ici.

Remarque: ES 5 n'optimise pas les appels finaux.

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

35
sheeldotme

En théorie oui. Comme l'indique l'autre réponse.

En pratique cependant, à compter de juillet 2017, seul Safari le prend en charge.

Compatibilité Javascript ES6 (ES2015): https://kangax.github.io/compat-table/es6/

12
AK_