При некорректном вводе отправляет в другую функцию

Программа играет с пользователем, загадывает число, а пользователь должен его отгадать. Всё работает хорошо, только если не ввести некорректное значение (число больше 100 или меньше 0, либо вообще не число), тогда программа, отрабатывает отмену, но всё равно выполняет код после (сравнение в функции checkNumber()). В чём может быть проблема?

И ещё, мне сказали что у меня неправильная генерация случайного числа, но я не понял почему. Можете подсказать?

let userNumber;

const randomNumber = Math.floor(Math.random() * 101);
console.log(randomNumber);

alert('Привет человек! Я загадал число от 0 до 100. Попробуй меня победить!')

function enterNumber() {
    userNumber = prompt('Введите число от 0 до 100: ');
    // если нажали отмена, то завершить программу
    if (userNumber == null) {
        alert('Пока!')
        return;
    }
    getUserNumber(userNumber);
    checkNumber(userNumber);
}

function checkNumber(num) {
    // сравнивает число которое "загадал" компьютер с числом пользователя
    if (randomNumber > num) {
        alert('Меньше!');
        enterNumber();
    }

    if (randomNumber < num) {
        alert('Больше!');
        enterNumber();
    }

    if (randomNumber == num) {
        alert ('Число ' + userNumber + ', это верное число! Человек, ты победил!');
        return;
    }

}

function getUserNumber(num) {
    // Проверка на число и на поподание в промежуток от 0 до 100
    if (!isNaN(parseFloat(num)) && isFinite(num) && num >= 0 && num <= 100) {
        num = Number(num);
        return num;
    }
    else {
        alert('Некорректно');
        enterNumber();
    }


}

enterNumber();


Ответы (1 шт):

Автор решения: azlov

только если не ввести некорректное значение (число больше 100 или меньше 0, либо вообще не число), тогда программа, отрабатывает отмену, но всё равно выполняет код после (сравнение в функции checkNumber())

Проблема здесь:

function enterNumber() {
  ..
  getUserNumber(userNumber); // даже если здесь проверка проверка определит, что число некорректно
  checkNumber(userNumber); // эта функция останется в стеке и будет вызвана
}

Поэтому вызывайте ее только когда уверены в корректности значения:

if (!isNaN(parseFloat(num)) && isFinite(num) && num >= 0 && num <= 100) {
   num = Number(num);
   checkNumber(num);
}
→ Ссылка