Проблема со стеком вызовов в функции

#javascript

Вопрос:

Я работал над простым веб-сайтом «камень, ножницы, бумага» из проекта Odin и пытался создать способ, чтобы игра останавливалась и сбрасывалась, как только кто-то наберет 5 баллов. В результате я создал новую функцию и установил остальную часть игры в другую функцию. Когда я играю в игру в первый раз, она отлично работает и вызывает функцию воспроизведения снова, чтобы начать новую игру. Во второй игре (и в других последующих играх) Я сталкиваюсь с проблемой, что игра проходит один ход 3 или 2 раза вместо одного раза. Я зашел в инструменты разработчика и увидел, что вместо завершения стека вызовов игра начинает пропускать возможность выбора для меня и использует мой последний выбор в качестве ответа на следующий ход.

Он должен идти: fullGame(), нажать кнопку выбора, чтобы начать playRound (), playerPlay (), computerPlay (), просмотреть условия, чтобы узнать, кто выиграл, game (), и если условия выполнены, playAgain() в противном случае вернет строку

Но во второй игре он перейдет прямо из game() в функцию playRound (), и я не понимаю, почему, поскольку я сделал это так, что в него можно играть только при нажатии кнопки.

Любая помощь будет признательна.

 function fullGame(){ i = 0; //player score variable j = 0; //computer score variable console.log("Hello"); //test to see if script runs console.log(i,j); function computerPlay(){ //computer choice function  const choices = ["rock", "paper", "scissors"]; //array of choices  return choices[Math.floor(Math.random() * choices.length)]; //chooses random value from array }  function playRound(e, compChoice, playerChoice){ //round function  function game(){  if(i === 5){  console.log(i);  playAgain();  return "You won the Match!"  }  else if (j === 5){  console.log(j);  playAgain();  return "You lost the Match!"  }  else{  console.log("next round")  return "Next Round!"  }  }  function playerPlay(){  if(e.srcElement.textContent === "Rock") {  return "rock";  }  else if(e.srcElement.textContent === "Paper") {  return "paper";  }  else if(e.srcElement.textContent === "Scissors") {  return "scissors";  }  }   compChoice = computerPlay();  playerChoice = playerPlay();  console.log(playerChoice);  console.log(compChoice);   if (playerChoice === "rock" amp;amp; compChoice === "scissors"){ //if player wins conditionals  console.log("You Win!");  i  ;  console.log(i, j);  game();  return "You won the round!";  }  else if (playerChoice === "paper" amp;amp; compChoice === "rock"){ //if player wins conditionals  console.log("You Win!");  i  ;  console.log(i, j);  game();  return "You won the round!";  }  else if (playerChoice === "scissors" amp;amp; compChoice === "paper"){ //if player wins conditionals  console.log("You Win!");  i  ;  console.log(i, j);  game();  return "You won the round!";  }  else if (playerChoice === compChoice){ //if the round is a tie  console.log("Tie");  console.log(i, j);  game();  return "The round is a tie!";  }  else{   console.log("You Lose."); //if computer wins the round  j  ;  console.log(i, j);  game();  return "You lost the round!";  } } const bttn = document.querySelectorAll("button"); bttn.forEach(bttn =gt; bttn.addEventListener("click", playRound)); }  function playAgain(){ alert("Would you like to play again?"); fullGame(); } fullGame();  

Комментарии:

1. Если вы помещаете bttn.forEach(bttn =gt; bttn.addEventListener("click", playRound)); внутрь fullGame , то каждый раз , когда вы звоните fullGame , вы привязываете другого прослушивателя событий. Если вы не хотите playRound , чтобы выполнение выполнялось более одного раза за клик, не помещайте эту строку внутри функции, которая будет вызываться несколько раз.