Вопрос проверяет понимание различий между setTimeout и setInterval для реализации периодических задач, а также умение выбирать правильный подход в зависимости от требований к точности и управлению.
Оба метода используются для выполнения кода с задержкой, но их поведение различается. setInterval запускает функцию через заданный интервал, не учитывая время выполнения самой функции. Если функция выполняется дольше интервала, вызовы могут накладываться, что приводит к неожиданным результатам. setTimeout же выполняет функцию один раз после задержки, и для повторения нужно вызывать его рекурсивно.
При использовании рекурсивного setTimeout новый таймер устанавливается только после завершения текущего вызова. Это гарантирует, что между вызовами будет пауза, равная задержке, и исключает наложение. Такой подход даёт больше контроля: можно динамически менять задержку, отменять выполнение или пропускать итерации.
// setInterval — может накладываться
let counter = 0;
const intervalId = setInterval(() => {
console.log(counter++);
// если выполнение займёт > 1000 мс, следующий вызов начнётся раньше
}, 1000);
// рекурсивный setTimeout — пауза между завершением и следующим стартом
let counter2 = 0;
function tick() {
console.log(counter2++);
setTimeout(tick, 1000); // следующий вызов через 1 сек после завершения
}
tick();Вывод: рекурсивный setTimeout предпочтительнее для сложных или длительных операций, где важна предсказуемость и контроль. setInterval удобен для простых повторяющихся действий с фиксированным интервалом.
Frontend developer
Ментор по Frontend
Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства
Записаться на консультацию