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

Das Ergebnis der drei Warnungen ist: 1, undefined, 2 (Chrome 25)Warum ist meine globale Variable vor der lokalen Deklaration schattiert?

Meine Frage ist: warum der zweite Alarm nicht definiert ist? Warum nicht 1? Gibt es keine globale Variable x?

+0

Weil Sie in Ihrer Funktion 'x' schattieren. Es gibt also eine Funktionsbereichsvariable "x", der noch kein Wert zugewiesen wurde, sodass Sie undefiniert werden. Daher ist es immer empfehlenswert, die Variablen am Anfang der Funktion zu deklarieren, da sie ohnehin für Sie erledigt werden. Versuch dich nicht zu verwirren. – Chad

Antwort

12

Aufgrund hoisting, ist es das, was ausgeführt wird:

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

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

Zu Beginn der Funktion y(), die lokale Variable x deklariert, aber nicht initialisiert.

+0

Aber wenn das "x" "hissen" ist, gibt es keinen Konflikt? weil da schon ein "x = 1" ist? Welche Erklärung ist die erste? das "hissen x" oder das "x = 1"? –

+0

Javascript hat keine "Konflikte" es "Schatten". Die lokale Variable "schattiert" alle Variablen mit demselben Namen ist ein höherer Bereich. Wenn Sie später 'x' verwenden, wird der Bereich mit den meisten lokalen Bereichen verwendet. Die globale Eins wird zuerst definiert, aber im Bereich von "y" wird die lokale verwendet. – Chad

+0

Das Scoping funktioniert so, dass JavaScript zunächst im lokalen Gültigkeitsbereich nach der Variablen x sucht. Wenn es gefunden wird, hört es auf zu schauen, also kommen wir nie zum globalen x. Wenn es nicht gefunden wird, verschiebt es sich um eine Ebene auf den Umfang, in dem die Funktion deklariert wurde, und sucht dort nach demselben Muster. (In diesem Fall findet es die Deklaration, da es den globalen Gültigkeitsbereich erreicht hat). Im Grunde funktioniert es wie eine Zwiebel, von innen nach außen. –

1

Die Variablendeklaration in der Funktion wird nach oben gehisst. So sieht es technisch wie folgt aus:

var y = function() { 
    var x; 

    alert(x); 

    x = 2; 
}; 

Die lokale Variable die globale einen Schatten stellt. Aus diesem Grund gibt die Warnung undefined zurück.

0

Da Bereich in JavaScript ein Funktionsobjekt ist. Wenn Sie Code in einer Funktion ausführen (Ihr Codebeispiel), wird "alert (x)" finden, ob es eine Definition von "x" in der Funktion gibt. Also, es gibt ein "var x = 2" in dieser Funktion. Aber die JavaScript-Laufzeit wird der Code wie folgt erklären:

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

Also, die x in der zweiten Warnung ist "undefined" nicht "1". Wenn Sie also eine Variable in einer Funktion deklarieren, empfehle ich Ihnen, die Variablen oben in Ihrer Funktion zu deklarieren.

Verwandte Themen