Оставить рекурсивные функции работать навсегда?

Я наткнулся на функцию, в которой было setTimeout внутри с экспоненциально растущим тайм-аутом (timeout *= 2).

let timeout = 10000
function foo() {
    // doSomething without breaking, returning
    setTimeout(foo, timeout)
    timeout *= 2;
}
foo()

Кажется, что это не должно быть проблемой, и интуитивно кажется, что setInterval уже делает то же самое (имея бесконечный цикл, пока он не будет отменен, если когда-либо), однако мой вопрос заключается в самом подходе.

  • Может ли это привести к утечке памяти?
  • Лучше/понятнее ли по-прежнему ограничивать количество вызовов функции?
  • Будут ли другие языки использовать такой подход или существуют другие подходы за пределами мира JS?

person Roland Jegorov    schedule 04.06.2018    source источник
comment
@RobIII Спасибо за комментарий. Нет, там не ломается.   -  person Roland Jegorov    schedule 04.06.2018
comment
Как указывали другие, я ошибался насчет stackoverflow; моя вина.   -  person RobIII    schedule 04.06.2018


Ответы (2)


Это не рекурсивный вызов функции. Вызов setTimeout приведет к тому, что foo будет вызван циклом обработки событий JavaScript позднее.

Этот код не вызовет переполнения стека или подобных проблем. Он должен быть полностью безопасным.

Чтобы глубже понять, как это работает, я предлагаю прочитать о цикле обработки событий JS и микрозадачах.

person korona    schedule 04.06.2018

Может ли это привести к утечке памяти?

-Если функция FOO() выполняется до завершения до того, как тайм-аут вызовет ее снова, то нет. Стек должен быть очищен.

Лучше/понятнее ли по-прежнему ограничивать количество вызовов функции?

-Да, поскольку ваша переменная тайм-аута в конечном итоге переполнится и может привести к непредвиденным результатам.

Будут ли другие языки использовать такой подход или существуют другие подходы за пределами мира JS?

-Зависит от того, как функции таймера работают для библиотеки/языка, который вы используете. Но это кажется простым и действенным способом увеличить время ожидания.

person miles_christian    schedule 04.06.2018