Why does the function return the wrong value?

  • 0
    Hello. I am new to JS. doing a simple task. I practice functions. I wrote this code
    <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>

    However, the checkAnswer function works strangely. If you enter something else to the question (yes / no) (random gibberish), then after the else function will call itself and ask the user again. If after that you already enter the answer 'yes', then, for some reason, instead of returning true, the function will return undefined and the gibberish that was entered before will be written to the variable answer (judging by the debugger). As a result, the if loop, which is outside the function, will go to the else branch and the program will end. Why it happens?
    JavaScript Lilah Bell, Aug 16, 2020

  • 1 Answers
  • 0
    Because you don't return anything if you entered gibberish on the first input.

    alert('Ввод не распознан');
    return checkAnswer(question);


    Now this function looks like this:

    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;
    }
    Amelia Hess

Your Answer
To place the code, please use CodePen or similar tool. Thanks you!