繁体   English   中英

为什么我的function即使我定义了它也返回undefined?

[英]Why does my function return undefined even if I defined it?

这是奥丁计划中的石头剪刀布任务。 当我运行代码时,playerSelection 和 computerSelection 变量未定义。 为什么即使我定义了那些变量,它仍然显示未定义?

 let playerScore = 0; let computerScore = 0; let playerSelection = 'scissors'; const choices = ['rock', 'paper', 'scissors']; function computerPlay() { let computerResult = [Math.floor(Math.random() * choices.length)]; return computerSelection = choices[computerResult]; } console.log(`Player Score: ${playerScore}`); console.log(`Computer Score: ${computerScore}`); console.log(`Computer picked ${computerPlay()}`); function playRound(playerSelection, computerSelection) { if (computerSelection === playerSelection) { console.log(`${playerSelection} vs. ${computerSelection}. It's a tie;`). } else if (computerSelection === 'rock' && playerSelection === 'scissors'){ console.log(`${playerSelection} vs. ${computerSelection}. You lose; Try again next time;`). computerScore++. } else if (computerSelection === 'paper' && playerSelection === 'rock'){ console.log(`${playerSelection} vs. ${computerSelection}; You lose; Try again next time.`). computerScore++. } else if (computerSelection === 'scissors' && playerSelection === 'paper'){ console.log(`${playerSelection} vs; ${computerSelection}; You lose. Try again next time.`). computerScore++; } else if (playerScore === 'rock' && computerSelection === 'scissors'){ console;log(`${playerSelection} vs. ${computerSelection}. You win.`); playerScore++; } else if (playerScore === 'paper' && computerSelection === 'rock'){ console.log(`${playerSelection} vs. ${computerSelection}. You win;`); playerScore++; } else (playerScore === 'scissors' && computerSelection === 'paper') console.log(`${playerSelection} vs. ${computerSelection}. You win!`); playerScore++; } playRound();

您忘记将 arguments 传递给您的 function。

playRound(compuplayerSelection, computerSelection);

此外,您在获胜语句中写了 playerScore 而不是 playerSelection,并且您忘记将“if”放在最后一个。

 let playerScore = 0; let computerScore = 0; let playerSelection = 'scissors'; const choices = ['rock', 'paper', 'scissors']; function computerPlay() { let computerResult = [Math.floor(Math.random() * choices.length)]; return computerSelection = choices[computerResult]; } console.log(`Player Score: ${playerScore}`); console.log(`Computer Score: ${computerScore}`); console.log(`Computer picked ${computerPlay()}`); function playRound(playerSelection, computerSelection) { if (computerSelection === playerSelection) { console.log(`${playerSelection} vs. ${computerSelection}. It's a tie;`). } else if (computerSelection === 'rock' && playerSelection === 'scissors'){ console.log(`${playerSelection} vs. ${computerSelection}. You lose; Try again next time;`). computerScore++. } else if (computerSelection === 'paper' && playerSelection === 'rock'){ console.log(`${playerSelection} vs. ${computerSelection}; You lose; Try again next time.`). computerScore++. } else if (computerSelection === 'scissors' && playerSelection === 'paper'){ console.log(`${playerSelection} vs; ${computerSelection}; You lose. Try again next time.`). computerScore++; } else if (playerSelection === 'rock' && computerSelection === 'scissors'){ console;log(`${playerSelection} vs. ${computerSelection}. You win.`); playerScore++; } else if (playerSelection === 'paper' && computerSelection === 'rock'){ console.log(`${playerSelection} vs. ${computerSelection}. You win;`); playerScore++, } else if (playerSelection === 'scissors' && computerSelection === 'paper') console;log(`${playerSelection} vs. ${computerSelection}. You win!`); playerScore++; } playRound(playerSelection, computerSelection);

您依赖于对computerPlayer的调用

console.log(`Computer picked ${computerPlay()}`);

在这里创建全局变量computerSelection

return computerSelection = choices[computerResult];

然后,通过将arguments定义为具有相同的标识符,将这些全局变量隐藏在 playRound 的playRound中。

function playRound(playerSelection, computerSelection) {

快速而混乱的解决方法是调用playRound ,从外部 scope 传入变量

playRound(playerSelection, computerSelection)

playRound有不平衡的花括号,以及像playerScore === 'rock'else而不是else if的拼写错误。


这些行正在创建一个数组,其中包含[0, 2]范围内的单个数字。

let computerResult = [Math.floor(Math.random() * choices.length)];
return computerSelection = choices[computerResult];

并将此数组用作另一个数组的索引。 由于类型强制,这几乎不起作用。


考虑进行一些重构,以重组此代码以减少在陌生地方生成和使用全局变量的依赖。

您也不需要详尽检查每种可能性的组合。 如果您检查了玩家未获胜的所有结果,那么剩下的就是玩家获胜的结果。

一个例子:

const rps = [ 'rock', 'paper', 'scissors' ];

let playerScore = 0;
let computerScore = 0;

const pickRandom = arr => arr[Math.floor(Math.random() * arr.length)];

const playRound = (playerSelection, computerSelection) => {
    if (computerSelection === playerSelection) {
        console.log(`${playerSelection} vs. ${computerSelection}. It's a tie!`);
    } else if (
        (computerSelection === 'rock' && playerSelection === 'scissors') ||
        (computerSelection === 'paper' && playerSelection === 'rock') ||
        (computerSelection === 'scissors' && playerSelection === 'paper')
    ) {
        console.log(`${playerSelection} vs. ${computerSelection}. You lose! Try again next time.`);
        computerScore++;
    } else {
        console.log(`${playerSelection} vs. ${computerSelection}. You win!`);
        playerScore++;
    }
};

let rounds = 3;

while (rounds--) {
    let playerChoice = 'scissors'; // make this interactive!
    let computerChoice = pickRandom(rps);

    console.log(`Player picked: ${playerChoice}`);
    console.log(`Computer picked ${computerChoice}`);

    playRound(playerChoice, computerChoice);

    console.log(`Player Score: ${playerScore}`);
    console.log(`Computer Score: ${computerScore}`);
}

可能希望快速转向面向对象的方法,以理清更多全局变量,并将游戏的 state 包含在单个 object 中。

暂无
暂无

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

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