繁体   English   中英

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

[英]How to change value of outer variable using a inner function?

在下面的代码中,当我使用函数 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>

Javascript 不通过引用传递变量 - 因此您在calcScore()中对playerScorecomputerScore所做的任何修改calcScore()适用于该函数。

您可以做的是使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>

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM