Как вложить оператор if в функцию? - Javascript - PullRequest
0 голосов
/ 05 мая 2020

Теперь, когда у меня есть рекурсивная функция, мне интересно, что лучше для продолжения того же потока.

Вложите другую функцию, не так ли?

Другими словами, мне нужно другое приглашение, которое спрашивает возраст пользователя, когда пользователь отвечает «да» на первое приглашение.

Проблема, с которой я столкнулся сейчас, заключается в том, что последнее приглашение не возвращается, если пользователь пишет что-то отличное от «да» или «нет».

То, как я вложил это, заставляет всплывающие подсказки так, что я не могу понять:

  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?");

Ответы [ 2 ]

2 голосов
/ 05 мая 2020

Проблема в том, что вы перезаписываете свою функцию. Если вы дадите своей второй функции другое имя, я думаю, она будет работать так, как вы хотите. И, как указано в другом ответе, вам не нужно определять свою функцию в условном предложении:

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?");
0 голосов
/ 05 мая 2020

Ваша проблема заключается в условном создании 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?")
...