2017-01-04 18 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

整潔。我想我可以使用開關來比較答案,但不太確定如何去做。 –

相關問題