Задать вопрос
@KralisV
Начинающий web frontend разработчик

В чем заключается ошибка этой логики рекурсии?

Столкнулся с неочевидной проблемой логики. Консоль на предмет ошибок упорно молчит, нейросеть ничего внятного по этому вопросу ответить не смогла, а я в упор не вижу причин ошибки.

function disco(delay) {
    setTimeout(function tick() {
        document.body.style.backgroundColor = "red";

        setTimeout(() => {
            document.body.style.backgroundColor = "green";
            tick();
        }, delay);
    }, delay);
}

disco(1000);


Код - простое баловство во время изучения работы таймеров, но мне бы очень хотелось понять причины подобного поведения.

По задумке функция tick() должна зацикливаться из-за вызова вложенной безымянной функции в setTimeout, при этом менять цвет фона. Но на практике вложенный таймер даже не срабатывает, цвет фона остается красным, хотя если закомментировать вызов tick() , то таймер срабатывает, вызывая безымянную функцию, меняющую цвет фона на зеленый. Естественно уже без рекурсии.

Очень хотелось бы понять пробелы в своей логике, буду благодарен если кто-то обьяснит причины такого контринтуитивного для меня поведения
  • Вопрос задан
  • 94 просмотра
Подписаться 1 Простой 6 комментариев
Решения вопроса 2
@timau32
Ну у тебя почти все правильно разве, что можно сделать его короче.

function disco(delay, isRed) {
    setTimeout(function tick() {
        document.body.style.backgroundColor = isRed ? 'red' : 'green';
        disco(delay, !isRed)
    }, delay);
}

disco(1000);


и в принципе потом можно по такой же логике просто подрубить setInterval вместо бесконечных генераций Таймаутов.
Ответ написан
Комментировать
WblCHA
@WblCHA
Ты не ту функцию вызываешь. У тебя мгновенно вешается красный после зелёного, естественно ты не увидишь разницы.
document.body.style.backgroundColor = "red";
document.body.style.backgroundColor = "green";
// delay
document.body.style.backgroundColor = "red";
document.body.style.backgroundColor = "green";
// delay
...


Тебе disco вызывать надо.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы