Это потому, что вы на самом деле не очистили интервал, вы должны предоставить функции clearInterval, которой требуется идентификатор интервала , чтобы узнать, какой интервал следует очистить. Смотри https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/clearInterval
Этот идентификатор фактически возвращается, когда вы вызываете функцию setInterval, поэтому ваша переменная countTime является вашим идентификатором интервала.
Именно поэтому, когда он достигает нуля, он работает, это потому, что вы правильно очищаете интервал, предоставляя его идентификатор функции clearInterval, и наоборот, вы просто предоставляете ссылку на функцию clearInterval в функции resetGame
Итак, что вы можете сделать, это на самом деле вернуть ваш intervalId из вашего countTime и предоставить его функции resetGame:
function countTime() {
...
const timer = document.querySelector('.timer');
// I renamed it just to be clear
const countTimeIntervalID = setInterval(function () {
counter--;
timer.innerHTML = + counter;
if (counter == 0) {
alert('Game over')
clearInterval(countTime);
}
}, 1000)
return countTimeIntervalID
}
let countTimeIntervalID = countTime();
function resetGame() {
...
clearInterval(countTimeIntervalID);
}
Также обратите внимание, что причина, по которой вы нажали кнопку сброса, удвоила время счетчика, потому что, поскольку вы не очистили первый, он все еще работал, поэтому фактически были интервалы, выполняющиеся и обновляющие его. элемент таймера dom