2017-01-04 20 views
1

免责声明:我对JavaScript很新,所以我猜测我要么做错了什么,要么误会这是如何工作的。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"; 
 
    } 
 
}

这些变量发生变化后,我在将它们作为单独的函数的参数(在岩石上,剪子,布的游戏),但功能似乎只看到被变量的原始值。

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 { 
 
    \t alert("Error, please try again."); 
 
    } 
 
    compareScore(); 
 
} 
 

 
gameStartV2(userAnswerContainer,computerAnswerContainer);

如果我运行参数函数内部的变量进行检查,我可以看到,他们确实从转变职能持有价值,然而if/else语句仍然是只看到0.这里发生了什么?

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

回答

2

你永远不更新自己的价值观:

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

    y = userAnswerContainer; 
    c = computerAnswerContainer; 

将其更改为这一点,因为预期它应该工作。

在您的代码中,脚本始终与提供给函数(00)的原始值一起工作。

你甚至都不需要提供gameStartV2的价值观从userAnswerContainercomputerAnswerContainer

做了一些改进这里的下方,采取高峰!

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 { 
 
    \t alert("Error, please try again."); 
 
    } 
 
    compareScore(); 
 
} 
 

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

 
gameStartV2(userAnswerContainer,computerAnswerContainer);

+1

,你并不需要的Y和C PARAMS – Cruiser

+0

啊,看起来像这样做的。 我是否认为y和c充当传递参数的占位符,并且他们会自动采用这些参数的最新设置值? –

+1

几乎,y和c是传递给函数的参数,它们是副本,而不是在执行时传递的变量的引用。这意味着他们不会更新,除非你这样做。 – Mouser

1

“Y” 和 “c” 是通过从传递给函数的初始值的值的副本。除去参数并仅使用实际变量,或者在您的gameStartV2函数中创建本地var副本,但在调用修改器函数后。

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(); 
} 
在这种情况下
+0

整洁。我想我可以使用开关来比较答案,但不太确定如何去做。 –

相关问题