Оставить рекурсивные функции работающими навсегда? - PullRequest
0 голосов
/ 04 июня 2018

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

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

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

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

Ответы [ 2 ]

0 голосов
/ 04 июня 2018

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

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

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

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

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

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

0 голосов
/ 04 июня 2018

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

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

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

...