现在我有了一个递归函数,我想知道为了让相同的流程继续,什么是最好的。
嵌套另一个函数,不是吗?
换句话说,我想要另一个提示,当用户对第一个提示回答是时询问用户的年龄。
我现在面临的问题是,如果用户写的不是“是”或“否”,最后一个提示不会回来。
他们嵌套的方式使提示以我无法弄清楚的方式弹出:
function showPrompt(msg) {
var str = prompt(msg).toLowerCase();
if (str === "yes") {
function showPrompt(firstQuestion) {
var age = prompt(firstQuestion).toLowerCase();
if (age < 21) {
alert("You're too young. Go home.");
} else if (age >= 21) {
alert("Welcome.");
} else {
showPrompt(firstQuestion);
}
}
showPrompt("How old are you?");
} else if (str === "no") {
alert("goodbye.");
} else {
showPrompt(msg);
}
}
showPrompt("Do you like gambling?");
你的问题是条件创造showPrompt调用的函数内showPrompt,看到if / else语句里面函数声明?. 虽然这样的声明是允许的,但它们有副作用,应该避免。
一个副作用是条件函数声明创建了一个未定义的局部变量,除非执行进入 if 块并为其分配一个值。在 OP 中,本地showPrompt声明隐藏了由全局函数声明创建的全局showPrompt。因此,如果块没有进入,当它被调用时,它的值是未定义的,并且会抛出一个 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 所指出的,您应该使用数字而不是字符串进行数字比较。使用比较运算符时,如果其中一个值是数字,则另一个值也将转换为数字进行比较。但是如果它们都是字符串(prompt返回一个字符串),它们将作为字符串进行比较。但为了可读性,最好两边都使用数字。
最后,您应该测试提示返回的值以查看它是一个字符串。如果用户单击“取消”,它将返回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?")
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句