Czy funkcje w JavaScript tail-call są zoptymalizowane?

Próbowałem zrozumieć Tail call optimization w kontekście JavaScript i napisałem poniżej metody rekurencyjne i rekurencyjne dla factorial().

Rekurencyjny:

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

Tail-recursive:

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

  return fact(n, 1)
}

Ale nie jestem pewien, czy wersja tail-recursive funkcji zostanie zoptymalizowana przez kompilator JavaScript, tak jak to się robi w innych językach, takich jak Scala itp. Czy ktoś może mi w tym pomóc?

Author: Aditya Singh, 2016-05-14

2 answers

Aktualizacja: od marca 13, 2018 Safari jest jedyną przeglądarką, która obsługuje optymalizację połączeń ogonowych.

Zespół chromium wyraźnie stwierdza, że optymalizacja połączeń ogonowych nie jest w trakcie aktywnego rozwoju i może być śledzona tutaj.

Implementację dla Firefoksa można śledzić tutaj

Original Post

Tak, ES2015 oferuje optymalizację połączeń ogonowych w trybie ścisłym. Dr Axel Rauschmayer pięknie to przedstawia pod linkiem poniżej, więc nie powtórzy tu jego słów.

Uwaga: ES 5 nie optymalizuje wywołań ogonowych.

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

 25
Author: sheeldotme,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-14 01:45:15

Teoretycznie tak. Jak stwierdza druga odpowiedź.

W praktyce jednak od lipca 2017 r.Nie Obsługuje ją tylko Safari.

JavaScript ES6 (ES2015) compatability: https://kangax.github.io/compat-table/es6/

 12
Author: AK_,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-31 16:15:15