Ваша проблема заключается в условном создании showPrompt внутри функции с именем showPrompt , см. Объявления функций внутри операторов if / else? . Хотя такие объявления разрешены, они имеют побочные эффекты, и их следует избегать.
Один побочный эффект заключается в том, что объявление условной функции создает локальную переменную, которая не определена, если выполнение не входит в блок if и не присваивает ей значение. В OP локальное объявление showPrompt затеняет глобальное showPrompt , созданное объявлением глобальной функции. Следовательно, если блок не введен, при его вызове его значение будет undefined и выдается TypeError, например
// Global foo
var foo = 23;
function bar() {
// Declaration creates a local foo even if
// if block is not entered
if (false) {
function foo (){}
}
// foo is undefined
console.log(typeof foo);
}
bar();
Чтобы исправить это, измените имя функции в блоке if и переместите ее из блока.
Также, как указал epascarello , вы должны выполнять сравнения numeri c, используя числа, а не строки. При использовании операторов сравнения, если одно из значений является числом, тогда другое будет также преобразовано в число для сравнения. Но если они обе строки ( подсказка возвращает строку), они будут сравниваться как строки. Но для удобства чтения лучше использовать числа для обеих сторон.
Наконец, вы должны протестировать значение, возвращаемое подсказкой, чтобы увидеть, что это строка. Если пользователь нажимает «Отмена», он вернет null , а вызов toLowerCase выдаст ошибку. Поэтому, если значение не является строкой, пользователь нажал кнопку «Отмена», и функция должна обработать его (например, выйти).
function showPrompt(msg) {
function showPrompt2(firstQuestion) {
var age = prompt(firstQuestion);
if (typeof age != 'string') {
return;
}
if (+age < 21) {
alert("You're too young. Go home.");
} else if (+age >= 21) {
alert("Welcome.");
} else {
showPrompt2(firstQuestion);
}
}
var str = prompt(msg);
if (typeof str != 'string') {
return;
}
str = str.toLowerCase();
if (str === "yes") {
showPrompt2("How old are you?");
} else if (str === "no") {
alert("goodbye.");
} else {
showPrompt(msg);
}
}
showPrompt("Do you like gambling?")