Javascript函数只看到作为参数传入的全局变量的默认值

时间:2017-01-04 14:29:18

标签: javascript function variables arguments

免责声明:我对Javascript相当陌生,所以我猜测我做错了什么,或者误解了这是怎么回事。

我有两个默认值为0的变量,稍后会被一些函数更改。



var userAnswerContainer = 0;
var computerAnswerContainer = 0;

function userInput() {
  userAnswerContainer = prompt("Please choose either Rock, Paper, or Scissors:").toLowerCase();
  switch (userAnswerContainer) {
    case "rock":
      break;
    case "paper":
      break;
    case "scissors":
      break;
    default:
      alert(userAnswerContainer + " is not a valid answer.");
      userInput();
  }
}

function computerInput() {
  computerAnswerContainer = Math.floor(Math.random() * 9);
  if (computerAnswerContainer <= 3) {
    computerAnswerContainer = "rock";
  } else if (computerAnswerContainer >= 4 && computerAnswerContainer <= 6) {
    computerAnswerContainer = "paper";
  } else {
    computerAnswerContainer = "scissors";
  }
}
&#13;
&#13;
&#13;

在更改了这些变量后,我将它们作为单独函数的参数传递(在岩石,纸张,剪刀游戏中),但函数似乎只能看到变量的原始值。 / p>

&#13;
&#13;
function gameStartV2(y, c) {
  userInput();
  computerInput();

  alert(computerAnswerContainer + " / " + userAnswerContainer);
  /*Testing: Displays values of AnswerContainers applied by respective functions*/

  if (c === y) {
    alert("You chose " + y + ". Computer chose " + c + ". It's a tie!");
  } else if (c === "rock") {
    if (y === "paper") {
      alert("Paper covers rock, you win!");
      userScore++;
    } else {
      alert("Rock smashes scissors, you lose!");
      computerScore++;
    }
    compareScore();
  } else if (c === "scissors") {
    if (y === "rock") {
      alert("Rock smashes scissors, you win!");
      userScore++;
    } else {
      alert("Scissors cuts paper, you lose!");
      computerScore++;
    }
  } else if (c === "paper") {
    if (y === "rock") {
      alert("Paper covers rock, you lose!");
      computerScore++;
    } else {
      alert("Scissors cuts paper, you win!");
      userScore++;
    }
  } else {
  	alert("Error, please try again.");
  }
  compareScore();
}

gameStartV2(userAnswerContainer,computerAnswerContainer);
&#13;
&#13;
&#13;

如果我对参数函数内部的变量进行检查,我可以看到它们确实保留了更改函数中的值,但if / else语句仍然只看到0.发生了什么这里吗?

Jfiddle:https://jsfiddle.net/Spiderpiggie/ucuzry8p/9/

3 个答案:

答案 0 :(得分:2)

您永远不会更新您的值:

function gameStartV2() {
  userInput();
  computerInput();

  y = userAnswerContainer;
  c = computerAnswerContainer;

将其更改为此,它应该按预期工作。

在您的代码中,脚本始终使用提供给函数的原始值(00)。

您甚至无需向gameStartV2提供userAnswerContainercomputerAnswerContainer

的值

在下面做了一些改进,达到顶峰!

&#13;
&#13;
var userAnswerContainer = 0;
var computerAnswerContainer = 0;
var userScore = 0;
var computerScore = 0;

function userInput() {
 var userAnswerContainer = prompt("Please choose either Rock, Paper, or Scissors:").toLowerCase(); //use var to keep it within the scope of this function.
  switch (userAnswerContainer) {
    case "rock":
      break;
    case "paper":
      break;
    case "scissors":
      break;
    default:
      alert(userAnswerContainer + " is not a valid answer.");
      userInput();
  }
  return userAnswerContainer;
}

function computerInput() {
  var computerAnswerContainer = Math.floor(Math.random() * 9); //use var to keep it within the scope of this function.
  if (computerAnswerContainer <= 3) {
    computerAnswerContainer = "rock";
  } else if (computerAnswerContainer >= 4 && computerAnswerContainer <= 6) {
    computerAnswerContainer = "paper";
  } else {
    computerAnswerContainer = "scissors";
  }
  return computerAnswerContainer; //use return to set the variable to computerAnswerContainer
}

function gameStartV2() {
  c = userAnswerContainer = userInput(); //set the global and c
  y = computerAnswerContainer = computerInput(); //set the global and y

  alert(computerAnswerContainer + " / " + userAnswerContainer);
  /*Testing: Displays values of AnswerContainers applied by respective functions*/

  if (c === y) {
    alert("You chose " + y + ". Computer chose " + c + ". It's a tie!");
  } else if (c === "rock") {
    if (y === "paper") {
      alert("Paper covers rock, you win!");
      userScore++;
    } else {
      alert("Rock smashes scissors, you lose!");
      computerScore++;
    }
  } else if (c === "scissors") {
    if (y === "rock") {
      alert("Rock smashes scissors, you win!");
      userScore++;
    } else {
      alert("Scissors cuts paper, you lose!");
      computerScore++;
    }
  } else if (c === "paper") {
    if (y === "rock") {
      alert("Paper covers rock, you lose!");
      computerScore++;
    } else {
      alert("Scissors cuts paper, you win!");
      userScore++;
    }
  } else {
  	alert("Error, please try again.");
  }
  compareScore();
}

function compareScore()
{
  alert("the score is you: " + userScore + " vs. computer: " + computerScore); 
}

gameStartV2(userAnswerContainer,computerAnswerContainer);
&#13;
&#13;
&#13;

答案 1 :(得分:1)

&#34; Y&#34;和&#34; c&#34;是传递给函数的原始值的值的副本。删除参数并只使用实际变量,或在gameStartV2函数中创建局部var副本,但在您调用修改器函数之后。

答案 2 :(得分:1)

function gameStartV2() {
    var y = userInput();
    var c = computerInput();
    var r;
    alert("Testing Check " + c + " / " + y);
    /*Testing: Displays values of AnswerContainers applied by respective functions*/
    if (y === c) {
        alert("You chose " + y + ". Computer chose " + c + ". It's a tie!");
    } else {
        r = y + c;
        switch (r) {
            case "paperrock":
                alert("Paper covers rock, you win!");
                userScore++;
                break;
            case "paperscissors":
                alert("Scissors cuts paper, you lose!");
                computerScore++;
                break;
            case "rockpaper":
                alert("Paper covers rock, you lose!");
                computerScore++;
                break;
            case "rockscissors":
                alert("Rock smashes scissors, you win!");
                userScore++;
                break;
            case "scissorspaper":
                alert("Scissors cuts paper, you win!");
                userScore++;
                break;
            case "scissorsrock":
                alert("Rock smashes scissors, you lose!");
                computerScore++;
                break;
            default:
                alert("Error, please try again.");
        }
    }
    compareScore();
}