如何在函数中嵌套if语句Javascript

如何在函数中嵌套if语句Javascript,javascript,function,if-statement,nested,Javascript,Function,If Statement,Nested,现在我有了一个递归函数,我想知道为了使相同的流继续下去,什么是最好的 嵌套另一个函数,不是吗 换句话说,我想要另一个提示,当用户对第一个提示回答“是”时,询问用户的年龄 我现在面临的问题是,如果用户写的不是“是”或“否”,最后一个提示就不会出现 它们以我嵌套的方式使提示以我无法理解的方式弹出: function showPrompt(msg) { var str = prompt(msg).toLowerCase(); if (str === "yes") {

现在我有了一个递归函数,我想知道为了使相同的流继续下去,什么是最好的

嵌套另一个函数,不是吗

换句话说,我想要另一个提示,当用户对第一个提示回答“是”时,询问用户的年龄

我现在面临的问题是,如果用户写的不是“是”或“否”,最后一个提示就不会出现

它们以我嵌套的方式使提示以我无法理解的方式弹出:

  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?");
函数显示提示(msg){
var str=prompt(msg).toLowerCase();
如果(str==“是”){
函数showPrompt(第一个问题){
var age=prompt(firstQuestion.toLowerCase();
if(年龄<21岁){
警惕(“你太年轻了,回家吧。”);
}否则,如果(年龄>=21岁){
警惕(“欢迎”);
}否则{
showPrompt(第一个问题);
}       
}
showPrompt(“你多大了?”);
}否则如果(str==“否”){
警惕(“再见”);
}否则{
showPrompt(msg);
}
}
showPrompt(“你喜欢赌博吗?”);

您的问题是在名为showPrompt的函数中有条件地创建showPrompt,请参阅。虽然这样的声明是允许的,但它们有副作用,应该避免

一个副作用是,条件函数声明创建了一个未定义的局部变量,除非执行进入if块并为其赋值。在OP中,本地showPrompt声明隐藏了由全局函数声明创建的全局showPrompt。因此,如果未输入块,则在调用它时,其值未定义,并抛出TypeError,例如

//全局foo
var-foo=23;
功能条(){
//声明创建本地foo,即使
//如果未输入数据块
if(false){
函数foo(){}
}
//foo是未定义的
控制台日志(foo类型);
}

bar()您的问题是在名为showPrompt的函数中有条件地创建showPrompt,请参阅。虽然这样的声明是允许的,但它们有副作用,应该避免

一个副作用是,条件函数声明创建了一个未定义的局部变量,除非执行进入if块并为其赋值。在OP中,本地showPrompt声明隐藏了由全局函数声明创建的全局showPrompt。因此,如果未输入块,则在调用它时,其值未定义,并抛出TypeError,例如

//全局foo
var-foo=23;
功能条(){
//声明创建本地foo,即使
//如果未输入数据块
if(false){
函数foo(){}
}
//foo是未定义的
控制台日志(foo类型);
}

bar()问题在于您正在覆盖函数。如果你给你的第二个函数取另一个名字,我想它会按照你想要的方式工作。如另一个答案所示,您不需要在宽恕条款中定义您的功能:

function showPrompt(msg) {
    var str = prompt(msg).toLowerCase();
    if (str === "yes") {
        nextQuestion("How old are you?");
    } else if (str === "no") {
        alert("goodbye.");
    } else {
        showPrompt(msg);
    }
}

function nextQuestion(secondQuestion) {
    var age = parseInt(prompt(secondQuestion));
    if (typeof age == "number" && age < 21) {
        alert("You're too young. Go home.");
    } else if (typeof age == "number" && age >= 21) {
        alert("Welcome.");
    } else {
        showPrompt(secondQuestion);
    }       
}

showPrompt("Do you like gambling?");
函数显示提示(msg){
var str=prompt(msg).toLowerCase();
如果(str==“是”){
下一个问题(“你多大了?”);
}否则如果(str==“否”){
警惕(“再见”);
}否则{
showPrompt(msg);
}
}
功能下一个问题(第二个问题){
var age=parseInt(提示(第二个问题));
如果(年龄类型==“数字”&&年龄<21岁){
警惕(“你太年轻了,回家吧。”);
}else if(年龄类型==“数字”&&age>=21){
警惕(“欢迎”);
}否则{
showPrompt(第二个问题);
}       
}
showPrompt(“你喜欢赌博吗?”);

问题在于您正在覆盖函数。如果你给你的第二个函数取另一个名字,我想它会按照你想要的方式工作。如另一个答案所示,您不需要在宽恕条款中定义您的功能:

function showPrompt(msg) {
    var str = prompt(msg).toLowerCase();
    if (str === "yes") {
        nextQuestion("How old are you?");
    } else if (str === "no") {
        alert("goodbye.");
    } else {
        showPrompt(msg);
    }
}

function nextQuestion(secondQuestion) {
    var age = parseInt(prompt(secondQuestion));
    if (typeof age == "number" && age < 21) {
        alert("You're too young. Go home.");
    } else if (typeof age == "number" && age >= 21) {
        alert("Welcome.");
    } else {
        showPrompt(secondQuestion);
    }       
}

showPrompt("Do you like gambling?");
函数显示提示(msg){
var str=prompt(msg).toLowerCase();
如果(str==“是”){
下一个问题(“你多大了?”);
}否则如果(str==“否”){
警惕(“再见”);
}否则{
showPrompt(msg);
}
}
功能下一个问题(第二个问题){
var age=parseInt(提示(第二个问题));
如果(年龄类型==“数字”&&年龄<21岁){
警惕(“你太年轻了,回家吧。”);
}else if(年龄类型==“数字”&&age>=21){
警惕(“欢迎”);
}否则{
showPrompt(第二个问题);
}       
}
showPrompt(“你喜欢赌博吗?”);

比较数字,比较字符串会得到意想不到的结果。谢谢。我现在遇到的问题是,当用户回答与“是”或“否”不同的问题时,最后一个提示不会返回。在控制台
console.log(“5”>“11”,5>11)
中运行此命令,您将看到为什么比较字符串与比较数字不同。谢谢@epascarello。最后的
showPrompt(“你喜欢赌博吗?”)你会怎么说返回到流中?`您不应该在块中定义函数,而是将其移动到包含函数的顶层。然后还需要调用函数(为函数指定不同的名称可能有助于了解发生的情况)。比较数字,比较字符串会得到意外的结果。谢谢。我现在遇到的问题是,当用户回答与“是”或“否”不同的问题时,最后一个提示不会返回。在控制台
console.log(“5”>“11”,5>11)
中运行此命令,您将看到为什么比较字符串与比较数字不同。谢谢@epascarello。最后的
showPrompt(“你喜欢赌博吗?”)你会怎么说返回到流中?`您不应该在块中定义函数,而是将其移动到包含函数的顶层。然后您还必须调用函数(为函数指定不同的名称可能有助于跟踪发生的情况)