Почему функция возвращает неверное значение?

Здравствуйте. Я новичок в JS. делаю простую задачку. Практикуюсь в функциях. Написал такой код
<meta charset="utf-8">
<script type="text/javascript">
    var riddles = new Map([
        ['Вертолет взлетает в северном полушарии и летит 500 км на север, 500 км на восток, 500 км на юг и 500 км на запад. Относительно точки своего взлета он приземлится а – северней, б – южней, в – западней или г – восточней?', ['г', 'восточней', 'восток', 'Верно, восточней! Все из-за кривизны земли и того, что меридианы не параллельны']],
        ['Стоит дом. Все стены у дома южные. К дому подходит медведь. Какого он цвета?', ['белый', 'белого', 'белый медведь', 'Верно! Дом стоит на северном полюсе. На северном полюсе обитают только белые медведи']],
        ['Что имеет больший вес на Земле: а – тонна древесины, б – тонна ваты, в – тонна стали или г – их веса одинаковы?', ['в', 'В', 'сталь', 'Сталь', 'тонна стали', 'Тонна стали', 'Верно, это сталь! Перельман бы вами гордился, ведь, скорее всего, вы отлично разбираетесь в физике. В вопросе говорится про вес, а вес – это равнодействующая всех сил, действующих на тело на опоре или подвесе. Вес измеряется в ньютонах, а тонна – это масса – мера инертности тела: измеряется в килограммах. Масса древесины, ваты и стали одинакова – одна тонна. Однако, тонна этих материалов занимает разный объем. По закону Архимеда, на тело, помещенное в жидкость или газ, действует выталкивающая сила, равная ВЕСУ вытесненного этим телом вещества (жидкости или газа). Эта сила противоположна по направлению силе тяжести. Так как в условии указано, что действие происходит на Земле, то все три материала находятся в атмосфере Земли, а значит, выталкивают собой определенный объем воздуха. Самый большой объем занимает тонна ваты, чуть меньше – древесина, а тонна стали занимает совсем небольшой объем, по сравнению с двумя остальными материалами, а значит, сила Архимеда для стали меньше будет компенсировать силу тяжести. Отсюда вывод – тонна стали ВЕСит больше.']]
    ]);

    function checkAnswer(question) {
        var answer = prompt(question).toLowerCase();
        if (answer == 'да') {
            return true;
        } else if (answer == 'нет') {
            return false;
        } else {
            alert('Ввод не распознан');
            checkAnswer(question);
        }
    }

    if (checkAnswer('Хотите загадку?(да/нет)')) {
        var countRight = 0;
        var numRiddles = riddles.size;
        var indexRiddle = 0;
        for (var [riddle, rightAnswer] of riddles) {
            var answer = prompt(riddle);
            ++indexRiddle;
            if (rightAnswer.slice(0, -1).includes(answer) && answer != '') {
                ++countRight;
                alert(rightAnswer.slice(-1));
            } else {
                alert('Ответ не верный.');
            }
            if (indexRiddle < numRiddles) {
                if (checkAnswer('Продолжаем?(да/нет)')) {
                    continue;
                } else break;
            } else {
                continue;
            }
        }
        alert(`На этом все!\nВы ответили верно на ${countRight} из ${numRiddles} загадок`);
    } else {
        alert('Ну и зря(((');
    }

</script>

Однако, функция checkAnswer работает странно. Если на вопрос (да/нет) ввести что-то другое (случайная абракадабра), то после else функция вызовет сама себя и еще раз спросит пользователя. Если после этого уже ввести ответ 'да', то , почему то, вместо того, чтобы вернуть true, функция вернет undefined а в переменную answer (судя по отладчику) запишется абракадабра, которую ввели до того. В результате цикл if , который вне функции, перейдёт в ветку else и программа завершиться. Почему так происходит?
  • Вопрос задан
  • 176 просмотров
Решения вопроса 1
WblCHA
@WblCHA
Потому что ты ничего не возвращаешь, если при первом вводе ввёл абракадабру.
alert('Ввод не распознан');
return checkAnswer(question);

А сейчас данная функция выглядит так:
function checkAnswer(question) {
        var answer = prompt(question).toLowerCase();
        if (answer == 'да') {
            return true;
        } else if (answer == 'нет') {
            return false;
        }
        alert('Ввод не распознан');
        checkAnswer(question); // возвращает true / false / undefined и идёт дальше, т.к. нет return
        return undefined;
    }
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
Artezio Нижний Новгород
от 130 000 до 180 000 ₽
Artezio Москва
от 160 000 до 220 000 ₽
Sportrecs Москва
от 150 000 до 200 000 ₽
29 нояб. 2020, в 01:16
500 руб./за проект
29 нояб. 2020, в 00:58
5000 руб./за проект
29 нояб. 2020, в 00:50
800 руб./за проект