【问题标题】:How can I assign forEach to variable? Its possible?如何将 forEach 分配给变量?这是可能的?
【发布时间】:2022-01-10 21:13:38
【问题描述】:

大家好:)我正在尝试写石头、剪子布游戏,但我遇到了一个小问题。是否有任何选项可以像我在这段代码中所做的那样将 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

【问题讨论】:

  • 不,这是不可能的。点击是异步的。您点了一份比萨饼,并且您一下单就想吃它。当他们单击时,您将不得不调用一个函数。 button.addEventListener('click', () => { theyClicked(button.id.toUpperCase()) }); 并在该函数中执行您需要执行的操作。
  • 您现在不能拥有用户在未来某个时间点击某物所产生的某些价值。
  • 谢谢!感谢您的帮助。
  • JS 是基于事件的;以下是解决方法:jsfiddle.net/by2f4cn9

标签: javascript variables foreach scope


【解决方案1】:

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

首先,forEach 永远不会返回任何内容,但其次,当用户实际单击按钮时,您稍后会返回 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());
    });
});

【讨论】:

  • 太好了,非常感谢,现在我可以继续编写代码了;)
  • 很高兴它有帮助。请继续将此答案标记为正确,以便其他用户可以找到它。
猜你喜欢
  • 2021-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多