如何使用内部函数更改外部变量的值?

时间:2020-10-05 03:30:41

标签: javascript

在以下代码中,当我使用函数calcScore时,外部变量playerScore和computerScore不会更新吗?如何使用功能更新它?据我了解,可以从内部作用域更改外部变量的值,但是为什么它在这里不起作用?

    <script>
        function playRound(playerSelection, computerSelection) {
            playerSelection = playerSelection.toLowerCase();
            computerSelection = computerSelection.toLowerCase();
            if (playerSelection === computerSelection) {
                return "draw";
            }
            else if (playerSelection === "rock"){
                if (computerSelection === "scissors") return "win";
                else if (computerSelection === "paper") return "lose";
            }
            else if (playerSelection === "paper"){
                if (computerSelection === "scissors") return "lose";
                else if (computerSelection === "rock") return "win";
            }
            else if (playerSelection === "scissors"){
                if (computerSelection === "rock") return "lose";
                else if (computerSelection === "paper") return "win";
            }
        }
        
        function computerSelection() {
            let selection = ["rock", "paper", "scissors"];
            return selection[Math.floor(Math.random() * selection.length)];
        }
        function calcScore(result, playerScore, computerScore) {
            if (result === "win") {
                playerScore += 1;
                console.log("win");
            }
            else if (result === "lose") {
                computerScore += 1;
                console.log("lose");
            }
            else if (result === "draw") {
                playerScore += 1;
                computerScore += 1;
            }
        }
        function game() {
            let playerScore = 0;
            let computerScore = 0;
            for (let i = 1; i <= 5; i++) {
                let result = playRound(prompt("Select rock, paper, or scissors!"), computerSelection());
                calcScore(result, playerScore, computerScore);
                console.log(`You have ${playerScore} points! Computer has ${computerScore} points!`);
            }
            playerScore, computerScore = 0, 0;
        }
    </script>

2 个答案:

答案 0 :(得分:1)

JavaScript不会通过引用传递变量-因此,您对playerScore中的computerScorecalcScore()所做的任何修改仅是该函数的本地变量。

您可以做的是设置playerScorecomputerScore全局变量。这样,任何修改都将在全球范围内。或者,您可以让calcScore()返回修改后的值。

使用全局方法:

    <script>
        let playerScore = 0;
        let computerScore = 0;

        function playRound(playerSelection, computerSelection) {
            playerSelection = playerSelection.toLowerCase();
            computerSelection = computerSelection.toLowerCase();
            if (playerSelection === computerSelection) {
                return "draw";
            }
            else if (playerSelection === "rock"){
                if (computerSelection === "scissors") return "win";
                else if (computerSelection === "paper") return "lose";
            }
            else if (playerSelection === "paper"){
                if (computerSelection === "scissors") return "lose";
                else if (computerSelection === "rock") return "win";
            }
            else if (playerSelection === "scissors"){
                if (computerSelection === "rock") return "lose";
                else if (computerSelection === "paper") return "win";
            }
        }
        
        function computerSelection() {
            let selection = ["rock", "paper", "scissors"];
            return selection[Math.floor(Math.random() * selection.length)];
        }
        function calcScore(result) {
            if (result === "win") {
                playerScore += 1;
                console.log("win");
            }
            else if (result === "lose") {
                computerScore += 1;
                console.log("lose");
            }
            else if (result === "draw") {
                playerScore += 1;
                computerScore += 1;
            }
        }
        function game() {

            for (let i = 1; i <= 5; i++) {
                let result = playRound(prompt("Select rock, paper, or scissors!"), computerSelection());
                calcScore(result);
                console.log(`You have ${playerScore} points! Computer has ${computerScore} points!`);
            }
            playerScore, computerScore = 0, 0;
        }
    </script>

替代方法:

    <script>
        function playRound(playerSelection, computerSelection) {
            playerSelection = playerSelection.toLowerCase();
            computerSelection = computerSelection.toLowerCase();
            if (playerSelection === computerSelection) {
                return "draw";
            }
            else if (playerSelection === "rock"){
                if (computerSelection === "scissors") return "win";
                else if (computerSelection === "paper") return "lose";
            }
            else if (playerSelection === "paper"){
                if (computerSelection === "scissors") return "lose";
                else if (computerSelection === "rock") return "win";
            }
            else if (playerSelection === "scissors"){
                if (computerSelection === "rock") return "lose";
                else if (computerSelection === "paper") return "win";
            }
        }
        
        function computerSelection() {
            let selection = ["rock", "paper", "scissors"];
            return selection[Math.floor(Math.random() * selection.length)];
        }
        function calcScore(result, playerScore, computerScore) {
            if (result === "win") {
                playerScore += 1;
                console.log("win");
            }
            else if (result === "lose") {
                computerScore += 1;
                console.log("lose");
            }
            else if (result === "draw") {
                playerScore += 1;
                computerScore += 1;
            }

            return [playerScore, computerScore];
        }
        function game() {
            let playerScore = 0;
            let computerScore = 0;
            for (let i = 1; i <= 5; i++) {
                let result = playRound(prompt("Select rock, paper, or scissors!"), computerSelection());
                let scores = calcScore(result, playerScore, computerScore);
                playerScore += scores[0];
                computerScore += scores[1]; 
                console.log(`You have ${playerScore} points! Computer has ${computerScore} points!`);
            }
            playerScore, computerScore = 0, 0;
        }
    </script>

答案 1 :(得分:0)

您两次定义了两个变量,所以现在很困惑。您是否希望能够在游戏功能中重用这些变量而无需重新定义它们?因为如果是这样,那么它们应该是全局变量而不是函数参数(您将无法使用该函数之外的函数参数中定义的变量)。