Здравствуйте. Я новичок в 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 и программа завершиться. Почему так происходит?