Ошибка JavaScript: «конкурс» не является функцией

#javascript #function #loops

#javascript #функция #циклы

Вопрос:

Я создаю простую игру «Камень, ножницы, бумага» на JavaScript, но я продолжаю сталкиваться с ошибкой, когда при вызове функции она продолжает возвращать, что это не так. Любая помощь будет оценена! Я уверен, что я просто вставляю не в то место или неправильно передаю переменные. Или я пытался перемещать его, и я пытался не передавать в него переменные, но он продолжает выдавать мне тот же код ошибки.

 var playGame = function() {
  var playerChoice = window.prompt("Choose your weapon! Enter r for Rock, p for paper, or s for Scissors.");
  console.log(playerChoice)
  switch (playerChoice) {
    case "r":
      console.log("Player chooses Rock!");
      break;
    case "p":
      console.log("Player chooses Paper!");
      break;
    case "s":
      console.log("Player chooses Scissors!");
      break;
    default:
      window.alert("You did not pick a valid option. Try again.");
      playGame();
      break;
  };
  var randomNum = Math.floor(Math.random() * 3   1);
  console.log(randomNum);
  var compChoice = "";
  switch (randomNum) {
    case 1:
      compChoice = "r";
      console.log(compChoice);
      break;
    case 2:
      compChoice = "p";
      console.log(compChoice);
      break;
    case 3:
      compChoice = "s"
      console.log(compChoice);
      break;
  };
  contest(playerChoice, compChoice);
};

var playConfirm = window.confirm("Would you like to play Rock, Paper, Scissors?");
if (playConfirm) {
  playGame();
} else {
  alert("Ok, maybe next time. Have a nice day!");
}
var contest = function(pChoice, cChoice) {
  // for () {
  switch (pChoice, cChoice) {
    case (pChoice === cChoice):
      window.alert("It's a tie!");
      // playAgain();
      break;
    case (pChoice = "r") amp;amp; (cChoice = "p"):
      window.alert("I won! Paper covers rock!");
      // playAgain();
      break;
    case (pChoice = "r") amp;amp; (cChoice = "s"):
      window.alert("You won! Rock crushes scissors!");
      // playAgain();
      break;
    case (pChoice = "p") amp;amp; (cChoice = "r"):
      window.alert("You won! Paper covers rock!");
      // playAgain();
      break;
    case (pChoice = "p") amp;amp; (cChoice = "s"):
      window.alert("I won! Scissors cuts paper!");
      // playAgain();
      break;
    case (pChoice = "s") amp;amp; (cChoice = "r"):
      window.alert("I won! Rock crushes scissors!");
      // playAgain();
      break;
    case (pChoice = "s") amp;amp; (cChoice = "p"):
      window.alert("You won! Scissors cuts paper!");
      // playAgain();
      break;
  }
};  

Комментарии:

1. Где возникает ошибка?

2. Вы получаете ошибку, потому что вы вызываете playGame (который вызывает contest ) до того, как функция была назначена contest .

Ответ №1:

Это потому, что вы использовали contest функцию перед определением.

Если вы переместите определение contest функции перед использованием, оно будет работать.

 var contest = function (pChoice, cChoice) {
  // for () {
  switch (pChoice, cChoice) {
    case (pChoice === cChoice):
      window.alert("It's a tie!");
      // playAgain();
      break;
    case (pChoice = "r") amp;amp; (cChoice = "p"):
      window.alert("I won! Paper covers rock!");
      // playAgain();
      break;
    case (pChoice = "r") amp;amp; (cChoice = "s"):
      window.alert("You won! Rock crushes scissors!");
      // playAgain();
      break;
    case (pChoice = "p") amp;amp; (cChoice = "r"):
      window.alert("You won! Paper covers rock!");
      // playAgain();
      break;
    case (pChoice = "p") amp;amp; (cChoice = "s"):
      window.alert("I won! Scissors cuts paper!");
      // playAgain();
      break;
    case (pChoice = "s") amp;amp; (cChoice = "r"):
      window.alert("I won! Rock crushes scissors!");
      // playAgain();
      break;
    case (pChoice = "s") amp;amp; (cChoice = "p"):
      window.alert("You won! Scissors cuts paper!");
      // playAgain();
      break;
  }
};

var playGame = function() {
  var playerChoice = window.prompt("Choose your weapon! Enter r for Rock, p for paper, or s for Scissors.");
  console.log(playerChoice)
  switch (playerChoice) {
    case "r":
      console.log("Player chooses Rock!");
      break;
    case "p":
      console.log("Player chooses Paper!");
      break;
    case "s":
      console.log("Player chooses Scissors!");
      break;
    default:
      window.alert("You did not pick a valid option. Try again.");
      playGame();
      break;
  };
  var randomNum = Math.floor(Math.random() * 3   1);
  console.log(randomNum);
  var compChoice = "";
  switch (randomNum) {
    case 1:
      compChoice = "r";
      console.log(compChoice);
      break;
    case 2:
      compChoice = "p";
      console.log(compChoice);
      break;
    case 3:
      compChoice = "s"
      console.log(compChoice);
      break;
  };
  contest(playerChoice, compChoice);
};

var playConfirm = window.confirm("Would you like to play Rock, Paper, Scissors?");
if (playConfirm) {
  playGame();
} else {
  alert("Ok, maybe next time. Have a nice day!");
}  

Комментарии:

1. Я добавил свой ответ внизу, который также работает. Итак, зачем перемещать window.confirm исправленное, интересно?

2. Это зависит от точки вызова функции. Когда вы ставите playConfirm выше contest , пока пользователь не введет запрос, contest часть определения не будет вызвана. Поэтому он будет неопределенным и не сможет быть вызван. Но после того, как вы переместили playConfirm раздел «Конкурс», это означает, что после запуска определения конкурса prompt будет показано. Таким образом, функция будет существовать.

3. @4156: Ваш ответ точно такой же, как этот. Вы не просто переместили window.confirm , вы также переместили playGame() вызов функции. Перемещение этих строк «вниз» и перемещение context объявления «наверх» дают тот же результат.

Ответ №2:

По какой-то причине перемещение

 var playConfirm = window.confirm("Would you like to play Rock, Paper, Scissors?");
if (playConfirm) {
  playGame();
} else {
  alert("Ok, maybe next time. Have a nice day!");
}
  

в нижней части исправлено, может быть, это как-то связано с тем, как он вызывает функции?