Я делаю игру, в которой есть таймер.
Я пытаюсь сделать следующее: когда игра запускается через gameState.init(), таймер запускается через timer.counter("start"), но при нажатии кнопки «перезапуск» таймер останавливается и сбрасывается через timer.counter("reset").
Таймер сбрасывается обратно на 0, но продолжает считать и не сбрасывается.
Ценю любое понимание, которое я могу получить. Заранее спасибо!
var gameState = {
init: function(){
var difficultyLevel = document.querySelector('input[name = "level"]:checked').value;
conditions.difficulty(difficultyLevel);
startFrame.classList.remove("active");
shuffleCards();
timer.counter("start");
display.moves(movesAllowed);
},
restart: function(){
startFrame.classList.add("active");
reset.allCards(cards);
shuffleCards();
timer.counter("reset");
matchCount = 0;
totalMoves = 0;
movesAllowed = 0;
timeAllowed = 0;
time = 0;
}
}
var timer = {
counter: function(status){
var clock = document.querySelector(".timer");
var incrementTime = setInterval(function(){
time++;
var minutes = Math.floor(time / 60);
var seconds = Math.floor(time % 60);
if (seconds < 10){
clock.innerText = minutes + ":0" + seconds;
} else {
clock.innerText = minutes + ":" + seconds;
}
}, 1000);
var stopTime = function(){
clearInterval(incrementTime);
}
if (status === "start"){
alert("counting");
}
if (status === "reset"){;
alert("reset");
stopTime();
}
}
}



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Две проблемы:
Переменная, содержащая интервал, incrementTime, является локальной для функции counter. Как только функция counter завершается, incrementTime собирает мусор, потому что больше не остается ссылки на интервал. Вместо этого вам нужно, чтобы переменная интервала была настойчивый.
Вы устанавливаете новый интервал, который вызывается каждый разcounter. Вероятно, вам следует установить интервал только тогда, когда status - это start, в противном случае старый интервал будет продолжать работать и не будет остановлен (переназначение интервала, которому назначен setInterval, не очищает интервал):
let interval; // <---- Persistent
var timer = {
counter: function(status){
var clock = document.querySelector(".timer");
if (status === 'start') {
interval = setInterval(() => { // <---- Assign to persistent variable
time++;
var minutes = Math.floor(time / 60);
var seconds = Math.floor(time % 60);
if (seconds < 10){
clock.innerText = minutes + ":0" + seconds;
} else {
clock.innerText = minutes + ":" + seconds;
}
}, 1000);
alert("counting");
} else if (status === "reset"){
var stopTime = function(){
clearInterval(interval); // <---- Clear persistent variable
}
alert("reset");
stopTime();
}
}
}
(Также было бы немного более элегантно, если бы функции stopTime и interval были постоянными, а не создавались заново каждый раз, когда они необходимы; например, вы могли бы назначить их свойствам timer)
Вы создаете другой интервал каждый раз, когда вызываете timer.counter (status), поэтому, конечно, он не остановит предыдущий интервал, который вы создали.