2013-04-02 11 views
5
x = 1; 
alert(x); 
var y = function() { 
    alert(x); 
    var x = 2; 
    alert(x); 
} 
y(); 

Wynik alarmuje 3 jest: 1, undefined, 2 (Chrome 25)Dlaczego moja zmienna globalna jest zacieniona przed deklaracją lokalną?

Moje pytanie brzmi: dlaczego drugi alert jest niezdefiniowana? Dlaczego nie 1? Czy nie ma zmiennej globalnej x?

+0

Ponieważ cień '' 'w swojej funkcji. Jest więc zmienna "x" o zakresie funkcji, która nie ma jeszcze przypisanej wartości, więc otrzymasz niezdefiniowanie. Dlatego zawsze zaleca się zadeklarowanie zmiennych na początku funkcji, ponieważ i tak zostanie to zrobione. Staraj się nie pomylić. – Chad

Odpowiedz

12

Ze względu na hoisting, to co zostanie wykonany:

x = 1; 
alert(x); 
var y = function() { 
    var x; // <-- this gets hoisted up from where it was. 

    alert(x); 
    x = 2; 
    alert(x); 
} 
y(); 

Na początku funkcji y() lokalna zmienna x jest zadeklarowana ale nie zainicjowany.

+0

, ale jeśli "x" oznacza "podnoszenie", czy nie występuje konflikt? ponieważ istnieje już "x = 1"? Która deklaracja jest pierwsza? "podnoszenie x" lub "x = 1"? –

+0

JavaScript nie ma "konfliktów" to "cienie". Zmienna lokalna "cienie" dowolne zmienne o tej samej nazwie mają wyższy zakres. Więc później, gdy używasz 'x', używa on zasięgu lokalnego. Globalny jest zdefiniowany jako pierwszy, ale w zakresie 'y' używany jest lokalny. – Chad

+0

Sposób działania scopingu polega na tym, że javascript najpierw sprawdza w zakresie lokalnym zmienną x. Jeśli go znajdzie, przestaje szukać, więc nigdy nie docieramy do globalnego x. Jeśli go nie znajdzie, przesunie się do poziomu, który był zasięgiem, gdy funkcja została zadeklarowana, i szuka tam tego samego wzorca. (W takim przypadku znajduje deklarację, odkąd osiągnął zasięg globalny). Zasadniczo działa jak cebula, na wylot. –

1

Deklaracja zmiennej w funkcji jest podnoszona do góry. Wygląda to tak:

var y = function() { 
    var x; 

    alert(x); 

    x = 2; 
}; 

Zmienna lokalna przesłania globalną. Właśnie dlatego alert zwraca undefined.

0

Ponieważ zakres w języku JavaScript jest obiektem funkcji. Kiedy wykonasz jakiś kod w funkcji (twój przykładowy kod), "alert (x)" znajdzie, czy istnieje jakaś definicja "x" w funkcji. W tej funkcji jest "var x = 2". Ale runtime JavaScript wyjaśni swój kod tak:

x = 1; 
alert(x); 
var y = function() { 
    var x; 
    alert(x); 
    x = 2; 
    alert(x); 
} 
y(); 

Tak, x w drugim alertu jest „nieokreślony” nie „1”. Więc kiedy zadeklarujesz jakąś zmienną w funkcji, polecam zadeklarować zmienne w górnej części twojej funkcji.