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?
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.
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/
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