Javascript - заставить локальную переменную действовать как глобальная - PullRequest
0 голосов
/ 02 марта 2019

Я изучаю локальные и глобальные переменные.В этой программе моя функция делает 2 вещи.Если вы введете число больше 0 в функцию, это sets переменная Y.Если вы передаете 0, это displays переменная Y.

function sety(x) {
  if (x>0)  y=x;  else alert(y);
}
<button onclick="sety(222)">SET Y to 222</button>
<button onclick="sety(333)">SET Y to 333</button>
<button onclick="sety(0)">display the Y variable</button>

В этом примере Y является глобальной переменной.Что если бы я хотел создать программу, не содержащую глобальных переменных?Если я добавлю var y в функцию, это сделает ее локальной, верно ?, но она не работает.

У меня также есть второй вопрос.Если бы я нажал кнопку «Показать» перед установкой переменной, я получил бы ошибку.Я попытался добавить if(x=="undefined"), но это все равно дало мне ошибку.Как я могу предотвратить ошибку в этой ситуации.

Ответы [ 4 ]

0 голосов
/ 02 марта 2019

Вы можете получить доступ к этой переменной следующим образом: window.y, поскольку вы неявно устанавливаете объект window, когда делаете это y = x.

Это необходимо для преодолениянеопределенная переменная задача

function sety(x) {
  if (x > 0) y = x;
  else alert(window.y);
}
<button onclick="sety(222)">SET Y to 222</button>
<button onclick="sety(333)">SET Y to 333</button>
<button onclick="sety(0)">display the Y variable</button>
0 голосов
/ 02 марта 2019

Вы можете добавить свойство в функцию и обновить его.

function sety(x) {
    if (x > 0) {
        sety.y = x;
    } else {
        alert(sety.y);
    }
}
<button onclick="sety(222)">SET Y to 222</button>
<button onclick="sety(333)">SET Y to 333</button>
<button onclick="sety(0)">display the Y variable</button>
0 голосов
/ 02 марта 2019

Причина, по которой он говорит, что y не определена, если вы пытаетесь отобразить переменную без настроек, это потому, что строка y = x действует как var y = x, которая определяет переменную y.Если эта строка не была выполнена до того, как вы попытались ее отобразить (чего не произойдет, если вы попытаетесь отобразить ее первой), то var y никогда бы не произошло, что выдает ошибку.Чтобы это исправить, вы должны определить y перед остальным.

Фрагмент ниже будет "локальной переменной".По сути, он просто переопределяет y при каждом выполнении функции.

function sety(x) {
  var y;
  if (x > 0) y = x;
  else alert(y);
}
<button onclick="sety(222)">SET Y to 222</button>
<button onclick="sety(333)">SET Y to 333</button>
<button onclick="sety(0)">display the Y variable</button>

Фрагмент ниже будет определять y, только если он уже не определен.

function sety(x) {
  if (x > 0) y = x;
  else {
    if (typeof y == 'undefined') {
      var y;
    }
    alert(y);
  }
}
<button onclick="sety(222)">SET Y to 222</button>
<button onclick="sety(333)">SET Y to 333</button>
<button onclick="sety(0)">display the Y variable</button>

Теперь я бы не советовал использовать код, который вы использовали.Ниже приведен фрагмент кода, который вы должны использовать.

function sety(x) {
  y = x;
}

function gety() {
  if (typeof y == 'undefined') {
    y = 'undefined';
  }
  alert(y);
}
<button onclick="sety(222)">SET Y to 222</button>
<button onclick="sety(333)">SET Y to 333</button>
<button onclick="gety()">display the Y variable</button>
0 голосов
/ 02 марта 2019

Создание замыкания.

(function() {
    var y; // y is now local to this closure
    window.sety = function(x) {
        // however you still want sety() to be a global function,
        // so you have to do this explicitly
        if( x > 0) y = x;
        else alert(y);
    };
})();

Я отмечу, что иметь функцию, делающую две вещи, - это, как правило, плохая идея, особенно с таким именем, как «set y».Попробуйте разделить это на две функции, sety(x) и gety(), причем последняя возвращает значение, а не просто предупреждает его.

...