SubUser
@SubUser
Когда уже на завод

Почему не меняется переменная в замыкании?

Есть функция newMinute() в середине функции startTimer() при первом вызове она работает правильно есть минута и она отнимаетсья и секунд становится 60, но в другом вызове minutes, seconds - не изменяются. - При стрелочной функции.
class Timer {
    startTimer(minutes = 0, seconds = 0) {

        newMinute();//work

        const timerID = setInterval(() => {
            seconds = Math.round(seconds);

            newMinute();//don't work

            this.spanMinutes.innerText = minutes;
            this.spanSeconds.innerHTML = seconds;
        },1000)

        function newMinute() {//Higher I write when I use arrow function
            if (!seconds) {
                if (!minutes)
                    this.endTimer(timerID);// don't work maybe due context
                minutes--;//if I use arrow function minutes don't change
                seconds = 60;//also don't change
            }
        }
    }

    endTimer(timerID, timerProgressBar) {
        this.screenSettings.style.display = 'block';
        this.screenTimer.style.display = 'none';
        clearInterval(timerID);
        clearInterval(timerProgressBar);
    }
}

const timeLapse = new Timer();

timeLapse.btnStart.onclick = () => timeLapse.startTimer(1, 20);
  • Вопрос задан
  • 69 просмотров
Решения вопроса 1
WblCHA
@WblCHA
Всё работает именно так, как ты и прописал.
newMinute если секунды равны нулю, отнимает минуту и делает секунды равные 60 (а должно быть 59, потому что 60 секунд = 0 секунд). Поскольку секунды нигде не уменьшаются (seconds--), то ты получаешь бесконечный цикл.

Более того, newMinute всё равно не будет работать, поскольку ты объявил её через function и она теряет контекст.
Тут либо биндить калбек интервала / саму newMinute, либо использовать стрелочную:
const newMinute = (timerID) => {//Higher I write when I use arrow function
        if (seconds < 1) {
          if (minutes < 1) {
            this.endTimer(timerID);// don't work maybe due context
            return;
          }
          minutes--;//if I use arrow function minutes don't change
          seconds = 59;//also don't change
          return;
        }
        seconds--;
      };
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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