如何将 forEach 分配给变量?这是可能的?

How can I assign forEach to variable? Its possible?

大家好:) 我正在尝试编写剪刀石头布游戏,但遇到了一些小问题。有没有像我在这段代码中所做的那样将 let playerChoice = buttons.forEach... 分配给任何变量的选项?不幸的是,它不是这样工作的。我在下面附上了我的代码。

感谢任何提示!

let choiceOptions = ["ROCK", "PAPER", "SCISSORS"];
let buttons = document.querySelectorAll('button');


let computerChoice = () => choiceOptions[Math.floor(Math.random() * choiceOptions.length)];

let playerChoice = buttons.forEach(button => {
    button.addEventListener('click', () => {
        return button.id.toUpperCase();
    });
});

console.log(playerChoice) //does not work

您不能使用 forEach 在这里做您想做的事。

首先,forEach 从来没有 return 任何东西,但其次,你 return 以后要 button.id.toUpperCase(),当用户实际上点击按钮。从事件处理程序返回不会在任何有用的地方分配值。

相反,您应该将 playerChoice 变量添加到共享的外部作用域中,并在事件发生时分配给它。

let playerChoice;
buttons.forEach(button => {
    button.addEventListener('click', () => {
        playerChoice = button.id.toUpperCase();
    });
});

这样,playerChoice 将在用户单击按钮时更新。

但是,这实际上可能对您没有帮助,因为您的代码不知道变量已更新。因此,让我们创建一个您的事件处理程序可以调用的回调。

let playerChoice;
let setPlayerChoice = (choice) => {
  playerChoice = choice;
  // we can use the value of playerChoice now, 
  // because this callback is being triggered 
  // by the user clicking the button.
  console.log(playerChoice); 
}
buttons.forEach(button => {
    button.addEventListener('click', () => {
        setPlayerChoice(button.id.toUpperCase());
    });
});