Передача и манипулирование глобальными переменными в функции

#javascript

#javascript

Вопрос:

Я просто просматриваю несколько руководств по изучению js, и у меня возникла проблема с пониманием того, как js передает переменные между функциями. Простая программа, которая увеличивает оценку platers по щелчку мыши до максимального значения и сбрасывает оценки.

Создать функцию внутри прослушивателя событий для каждой кнопки проигрывателя было относительно легко, но я понял, что повторно использую код, поэтому хотел создать функцию, которая выполняла бы работу за оба. Моя проблема в том, что когда я обновляю переменные внутри функции, они не соотносятся с глобальными переменными и не обновляются.

код здесь:

 // global variables
var inputScore = document.querySelector("#maxScore")
var p1btn = document.querySelector("#p1Input");
var p2btn = document.querySelector("#p2Input");
var reset = document.querySelector("#reset");

var p1 = document.querySelector("#p1");
var p1Score = 0;
var p2 = document.querySelector("#p2");
var p2Score = 0;

var maxScore = 5
var gameOver =false;

// event listeners
p1btn.addEventListener("click",function(){
  scoreUpdate(p1,p1Score,maxScore,gameOver);
});

p2btn.addEventListener("click",function(){
  scoreUpdate(p2,p2Score,maxScore,gameOver);
});
// reset Button
reset.addEventListener("click",function(){
  // make sure you dont hit game over twice
  if(gameOver){
    gameOver=!gameOver
  }
  p1Score=0
  p1.textContent = p1Score;
  p1.classList.remove("green")
  p2Score=0
  p2.textContent = p2Score;
  p2.classList.remove("green")
});

//updateScore function to be called on either player buttons
function scoreUpdate(playerDisplay, playerScore,maxScore,gameOver){
  console.log("hit")
  console.log("PlayerDisplay",playerDisplay,"playerScore",playerScore,"maxScore",maxScore,"gameOver",gameOver)
  if(playerScore < maxScore amp; !gameOver){
      playerScore  ;
      playerDisplay.textContent = playerScore;
      if(playerScore ==maxScore){
        gameOver=!gameOver
        playerDisplay.classList.add("green")
      }
    }
  console.log("PlayerDisplay",playerDisplay,"playerScore",playerScore,"maxScore",maxScore,"gameOver",gameOver)

}
  

Заранее спасибо!

Ответ №1:

Вам нужно узнать о области видимости переменных.
При передаче gameOver в scoreUpdate функцию она становится локальной переменной, определенной в теле этой функции; и она отличается от глобальной gameOver переменной.

Если вы хотите изменить глобальную переменную, не передавайте ее как параметр.

В Интернете есть множество статей по этому вопросу, чтобы узнать больше:https://www.sitepoint.com/demystifying-javascript-variable-scope-hoisting /

Ответ №2:

Вы можете использовать return для переопределения старой переменной, это заменит старую переменную новыми данными.

 p1Score = scoreUpdate(p1,p1Score,maxScore,gameOver);
p2Score = scoreUpdate(p2,p2Score,maxScore,gameOver);

function scoreUpdate(playerDisplay, playerScore,maxScore,gameOver){
  console.log("hit")
  console.log("PlayerDisplay",playerDisplay,"playerScore",playerScore,"maxScore",maxScore,"gameOver",gameOver)
  if(playerScore < maxScore amp; !gameOver){
      playerScore  ;
      playerDisplay.textContent = playerScore;
      if(playerScore ==maxScore){
        gameOver=!gameOver
        playerDisplay.classList.add("green")
      }
    }
  console.log("PlayerDisplay",playerDisplay,"playerScore",playerScore,"maxScore",maxScore,"gameOver",gameOver)

return playerScore;
}