【问题标题】:JavaScript error: 'contest' is not a functionJavaScript 错误:“竞赛”不是函数
【发布时间】:2020-10-16 17:53:22
【问题描述】:

我正在用 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") && (cChoice = "p"):
      window.alert("I won! Paper covers rock!");
      // playAgain();
      break;
    case (pChoice = "r") && (cChoice = "s"):
      window.alert("You won! Rock crushes scissors!");
      // playAgain();
      break;
    case (pChoice = "p") && (cChoice = "r"):
      window.alert("You won! Paper covers rock!");
      // playAgain();
      break;
    case (pChoice = "p") && (cChoice = "s"):
      window.alert("I won! Scissors cuts paper!");
      // playAgain();
      break;
    case (pChoice = "s") && (cChoice = "r"):
      window.alert("I won! Rock crushes scissors!");
      // playAgain();
      break;
    case (pChoice = "s") && (cChoice = "p"):
      window.alert("You won! Scissors cuts paper!");
      // playAgain();
      break;
  }
};

【问题讨论】:

  • 错误出现在哪里?
  • 您收到错误是因为您在将函数分配给 contest 之前调用了 playGame(它调用了 contest)。

标签: javascript function loops


【解决方案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") && (cChoice = "p"):
      window.alert("I won! Paper covers rock!");
      // playAgain();
      break;
    case (pChoice = "r") && (cChoice = "s"):
      window.alert("You won! Rock crushes scissors!");
      // playAgain();
      break;
    case (pChoice = "p") && (cChoice = "r"):
      window.alert("You won! Paper covers rock!");
      // playAgain();
      break;
    case (pChoice = "p") && (cChoice = "s"):
      window.alert("I won! Scissors cuts paper!");
      // playAgain();
      break;
    case (pChoice = "s") && (cChoice = "r"):
      window.alert("I won! Rock crushes scissors!");
      // playAgain();
      break;
    case (pChoice = "s") && (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!");
}

【讨论】:

  • 我在底部添加了我的答案,这也有效。那么我想知道为什么要移动window.confirm 固定呢?
  • 这取决于函数调用的点。当您将playConfirm 放在contest 上方时,直到用户在提示符上输入,contest 定义部分将不会被调用。所以它将是未定义的并且无法调用。但是在您将playConfirm 移动到比赛下之后,这意味着在比赛定义运行之后,prompt 将被显示。所以这个函数就存在了。
  • @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!");
}

到底部修复它,可能与它如何调用函数有关?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-02
    • 2012-04-07
    • 1970-01-01
    • 1970-01-01
    • 2013-12-20
    • 1970-01-01
    相关资源
    最近更新 更多