Вернуться к статьям

Хвостовая рекурсия в JavaScript: стандарт есть, а оптимизации нет. Готовься к stack overflow

9 мая 2026
1 мин чтения
Хвостовая рекурсия в JavaScript: стандарт есть, а оптимизации нет. Готовься к stack overflow

ES2015 обещал хвостовую оптимизацию, но браузеры её проигнорировали — твоя рекурсия всё ещё падает с переполнением стека.

Помните, как в ES2015 нам пообещали, что хвостовая рекурсия будет оптимизироваться? Спойлер: большинство движков JS так и не внедрили эту фичу. В итоге твой красивый рекурсивный код, который ты писал с гордостью, всё ещё способен положить стек быстрее, чем ты скажешь "stack overflow".

Автор статьи разбирает, почему так вышло. Оказывается, реализация tail call optimization (TCO) — это не просто "поставь галочку". Она ломает стектрейсы, усложняет отладку и требует серьёзных изменений в движке. Браузеры вроде Safari её таки внедрили, но Chrome и Firefox решили, что игра не стоит свеч. Теперь у нас есть стандарт, который никто не соблюдает — классика жанра.

Что делать разработчику? Не уповать на TCO. Использовать итеративные алгоритмы, trampolining или просто не писать рекурсию глубже 10 тысяч вызовов. Автор предлагает конкретные паттерны: например, превратить хвостовую рекурсию в цикл с помощью аккумулятора. Звучит как шаг назад, но зато стек останется цел.

Комментарий студии METABYTE: Мы тоже любим писать элегантный код, но когда он падает в продакшене, элегантность куда-то улетучивается. Лучше потратить лишние 10 минут на итеративный вариант, чем потом объяснять клиенту, почему его сервер лёг от трёх рекурсивных вызовов. Помните: стек — он как здоровье, беречь надо смолоду.

Хвостовая рекурсия в JavaScript: стандарт есть, а оптимизации нет. Готовься к stack overflow | METABYTE — METABYTE