Подтвердить что ты не робот

Оптимизированы ли функции JavaScript-хвоста?

Я пытаюсь понять Tail call optimization в контексте JavaScript и написал ниже рекурсивные и хвосто-рекурсивные методы для factorial().

Рекурсивный:

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

Tail-рекурсивный:

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 и т.д. Может ли кто-нибудь помочь мне на этом?

4b9b3361

Ответ 1

Да, ES2015 предлагает оптимизацию хвостового вызова в строгом режиме. Доктор Аксель Раушмайер прекрасно объясняет это по ссылке ниже, поэтому я не буду повторять его слова здесь.

Примечание. ES 5 не оптимизирует хвостовые вызовы.

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

Ответ 2

В теории да. Как утверждает другой ответ.

На практике, однако, по состоянию на июль 2017 года только Safari поддерживает его.

Совместимость Javascript ES6 (ES2015): https://kangax.github.io/compat-table/es6/