Jak zmienić wartość zmiennej globalnej wewnątrz funkcji

136

Używam JavaScript i tworzę zmienną globalną. Definiuję to poza funkcją i chcę zmienić wartość zmiennej globalnej z wnętrza funkcji i użyć jej z innej funkcji, jak to zrobić?

NullPoiиteя
źródło

Odpowiedzi:

151

Po prostu odwołaj się do zmiennej wewnątrz funkcji; bez magii, po prostu użyj jej nazwy. Jeśli został utworzony globalnie, zaktualizujesz zmienną globalną.

Możesz nadpisać to zachowanie, deklarując je lokalnie przy użyciu var, ale jeśli nie używasz var, nazwa zmiennej używana w funkcji będzie globalna, jeśli ta zmienna została zadeklarowana globalnie.

Dlatego za najlepszą praktykę uważa się zawsze jawne deklarowanie zmiennych za pomocą var. Bo jeśli o tym zapomnisz, możesz przypadkowo zacząć bawić się globalnymi. To łatwy błąd. Ale w twoim przypadku sytuacja się odwraca i staje się łatwą odpowiedzią na twoje pytanie.

Spudley
źródło
3
To nie działa dla mnie: country = 'foo' $ .ajax ({url: '/ some-endpoint', success: function (data) {country = data.country;}}); console.log (country) // wyświetla 'foo'
Mark Simpson
41
@MarkSimpson - powodem, dla którego nie działa, jest to, że w twoim przykładzie console.logjest on uruchamiany natychmiast, ale funkcja Ajax sukcesu działa tylko w pewnym momencie później, gdy wywołanie Ajax faktycznie zwraca odpowiedź. Jest to fundamentalna kwestia dotycząca asynchronicznej natury Ajax: kod w funkcjach zamykających nie działa w kolejności z kodem wokół niego. Jest to ważne, aby zrozumieć, ucząc się kodu sterowanego zdarzeniami.
Spudley,
Sposobem na to, aby console.log był bardziej dokładny w tym przypadku, byłoby umieszczenie go wewnątrz funkcji AJAX sukcesu.
DWils,
1
Kolejna z moich genialnych spostrzeżeń: dokładnie sprawdź pisownię i wielkość liter w nazwie zmiennej. Bardzo łatwo jest przeoczyć coś tak prostego, jak sessionId lub sessionID.
siwobrody
Mam z nimi ten sam problem. Ale w końcu zrozumiałem, dzięki @Spudley!
Yudhistira Bayu
68
var a = 10;

myFunction();

function myFunction(){
   a = 20;
}

alert("Value of 'a' outside the function " + a); //outputs 20
Chris
źródło
1
dzięki za ten wspaniały, prosty przykład. Logika tego polegała na tym, że wpadłem w głowę. Po prostu przyzwyczaiłem się do myślenia 4d.
Mikey3Strings
29

Po prostu użyj nazwy tej zmiennej.

W JavaScript zmienne są lokalne tylko dla funkcji, jeśli są parametrami funkcji lub jeśli deklarujesz je jawnie jako lokalne, wpisując varsłowo kluczowe przed nazwą zmiennej.

Jeśli nazwa wartości lokalnej ma taką samą nazwę jak wartość globalna, użyj windowobiektu

Zobacz to jsfiddle

x = 1;
y = 2;
z = 3;

function a(y) {
  // y is local to the function, because it is a function parameter
  console.log('local y: should be 10:', y); // local y through function parameter
  y = 3; // will only overwrite local y, not 'global' y
  console.log('local y: should be 3:', y); // local y
  // global value could be accessed by referencing through window object
  console.log('global y: should be 2:', window.y) // global y, different from local y ()

  var x; // makes x a local variable
  x = 4; // only overwrites local x
  console.log('local x: should be 4:', x); // local x
  
  z = 5; // overwrites global z, because there is no local z
  console.log('local z: should be 5:', z); // local z, same as global
  console.log('global z: should be 5 5:', window.z, z) // global z, same as z, because z is not local
}
a(10);
console.log('global x: should be 1:', x); // global x
console.log('global y: should be 2:', y); // global y
console.log('global z: should be 5:', z); // global z, overwritten in function a

Edytować

Wraz z ES2015 pojawiły się jeszcze dwa słowa kluczowe consti let, które również wpływają na zakres zmiennej ( specyfikacja języka )

yunzen
źródło
1
+1 za opisanie kolizji nazw między zmienną globalną i zadeklarowaną lokalnie oraz sposób uzyskania do niej dostępu.
gdbj
6
<script>
var x = 2; //X is global and value is 2.

function myFunction()
{
 x = 7; //x is local variable and value is 7.

}

myFunction();

alert(x); //x is gobal variable and the value is 7
</script>
Iman Sedighi
źródło
Po prostu nie używaj varsłowa kluczowego wewnątrz funkcji, wtedy nie musisz się z tym uporaćdocument.getElementById("outside").value = x;
Ben Aubin
6
var a = 10;

myFunction(a);

function myFunction(a){
   window['a'] = 20; // or window.a
}

alert("Value of 'a' outside the function " + a); //outputs 20

Za pomocą window [' nazwa_zmiennej '] lub window.variableName możesz modyfikować wartość zmiennej globalnej wewnątrz funkcji.

Sterling Diaz
źródło
Tylko w ten sposób mogę zmienić wartość zmiennej globalnej w komponencie kątowym !!!
Padmaraj Bhat