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

扬·海德·别津斯基

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

嵌套另一个函数,不是吗?

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

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

他们嵌套的方式使提示以我无法弄清楚的方式弹出:

  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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章