Оператор JavaScript if не работает, кроме как внутри функции. Кто-нибудь знает, как это исправить?

#javascript #html

#javascript #HTML

Вопрос:

У меня есть эта функция, которая предупреждает пользователя, когда их количество «лунного камня» равно 10. Однако по разным причинам я бы хотел, чтобы оператор if находился вне функции. Однако, когда я это делаю, предупреждение не работает. Не мог бы кто-нибудь объяснить и опубликовать исправление для этого?

 <!DOCTYPE html>
<html>
<img id="game-board" onclick="totalCount()" class="game-board" src="https://pics.clipartpng.com/thumbs/Mars_PNG_Clip_Art-3002.png"></img>
<h2 id="counts">Moonstone:</h2> 
<script>

let stone = 0;
function totalCount() {
let newCounts = stone  ;
document.getElementById('counts').innerHTML= "Moonstone:"  newCounts;
}

if (newCounts == 10){
alert('10');
}

</script>
</html>
  

Что работает, но я не хочу использовать, это

 <DOCTYPE html>
<html>
<img id="game-board" onclick="totalCount()" class="game-board" src="https://pics.clipartpng.com/thumbs/Mars_PNG_Clip_Art-3002.png"></img>
<h2 id="counts">Moonstone:</h2> 
<script>

let stone = 0;
function totalCount() {
let newCounts = stone  ;
document.getElementById('counts').innerHTML= "Moonstone:"  newCounts;
if (newCounts == 10){
alert('10');
}
}


</script>
  

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

1. вам нужно посмотреть на область видимости

2. Это «не работает», потому что (1) вы пытаетесь использовать переменную вне функции, в которой она определена, и (2) вы пытаетесь использовать ее только один раз сразу после загрузки страницы, прежде чем она когда-либо получит искомое значение. Если у вас уже есть рабочая версия, в чем проблема? Почему вы не хотите использовать рабочий код?

Ответ №1:

В вашем коде вы вызываете функцию totalcount() при событии onclick, поэтому все, что находится внутри функции totalcount(), будет выполнено, а код вне функции totalcount() выполняться не будет

Ответ №2:

Я не совсем понимаю, почему вам не нужен тест if внутри функции. Но есть кое-что, что вы могли бы сделать:

     const counter = {
      value: 0,
      addOne: function() {
        this.value  ;
        if (this.value > 10) {
          alert("Too many");
          this.value--;
        } else {
          document.getElementById("counts").innerHTML = "Moonstones: "   this.value;
        }
      }
    }

    function updateCounter() {
      counter.addOne();
    }  
 <button onclick="updateCounter();">Add</button>
<div id="counts"></div>  

Это создает счетчик как объект и включает в себя тест if для функции addOne, непосредственно прикрепленной к этому объекту. Всякий раз, когда вызывается функция updateCounter(), функция addOne обновляет значение счетчика и проверяет, прошло ли оно 10. Если это так, пользователь получает и оповещение, в противном случае элемент «counts» обновляется.

Но, как говорили другие, нет реальной причины, по которой тест if не должен быть частью функции — возможно, вы могли бы объяснить свои причины этого требования?

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

1. Причина, по которой мне это нужно отдельно, заключается в том, что показанный код является небольшой частью игры, которую я создаю. По сути, пользователь открывает новые планеты своим «лунным камнем». Однако для этого мне нужна функция, которая проверяет значение переменной stone и предупреждает пользователя, может ли он купить планету или нет. Проблема в том, что, поскольку переменная stone и счетчик находятся в функции, когда я проверяю их значения в новой функции, чтобы отправить оповещения и вычесть необходимый камень у пользователя, это не работает.

2. Переменные определены в функции, потому что именно там они были определены. Вы можете определить переменные вне функции и обновить их внутри функции. Поскольку они находятся вне функции, они являются «глобальными» и их можно увидеть из любой другой функции. Итак, введите «let newCounts;» над функцией и удалите «let» из «let newCounts = stone ;» внутри функции. Затем newCounts становится видимым для других функций