27 Stimmen

Warum killt eine lokale Variable meine globale Variable?

Entschuldigen Sie diese Frage, aber dieses Problem hat mir den Tag versaut.

Die folgenden Code-Ausschreibungen 10 wie es sein sollte:

var globalId='10';  
function check(){  
    alert(globalId);  
}  
check();

Aber der nächste Code meldet undefiniert :

var globalId='10';  
function check(){  
    alert(globalId); 
    var globalId; 
}  
check();

Ich bin mir bewusst, dass eine Variable, die ich in einer Funktion deklariere, eine lokale Variable ist, aber wenn ich sie bereits als global deklariert habe, wie kann es dann sein, dass meine Warnungen sagen undefiniert ?

Dies ist ein einfaches Beispiel, aber in meinem ursprünglichen Code habe ich eine Menge Dinge zwischen dem Anfang der Funktion getan, dann einen langen Weg nach unten habe ich geprüft, ob globalId definiert wurde, sonst definieren Sie es: if(!globalId){var globalId;} Das bedeutete, dass meine Warnung am Anfang der Funktion undefiniert war, als ob JavaScript zuerst die ganze Funktion ausgeführt hätte, um zu sehen, ob irgendwelche Variablen deklariert sein könnten, und wenn ja, sie zu deklarieren, und deshalb zeigte meine Warnung auf eine "nicht deklarierte" Variable.

Kann mir jemand erklären, warum dies geschehen, und wenn es wahr ist, dass JavaScript "pre-declares" alle Variablen vor der Ausführung einer Funktion, auch Variablen in Bedingungen nicht einmal erfüllt deklariert?

0 Stimmen

Lokale Variablen haben immer Vorrang vor globalen Variablen. Das gilt auch für C und die meisten anderen Sprachen. In C++ können Sie die globale Variable auswählen, indem Sie :: . Globale und lokale Variablen ähnlich zu benennen, ist ohnehin eine schlechte Praxis

24voto

Sachin Shanbhag Punkte 52789

In javascript, sollten Sie wissen, es gibt etwas als genannt HOISTING .

Das bedeutet im Wesentlichen, dass bei der Deklaration lokaler Variablen die Variablendeklaration automatisch an den Anfang des Geltungsbereichs übertragen wird.

z.B.:-

var globalId='10';
function check(){
alert(globalId); var globalId; }
check(); 

Änderungen an -

var globalId='10';
function check(){
var globalId;
alert(globalId);}
check(); 

Da globalID noch immer kein Wert zugewiesen ist, wird in Ihrer Ausgabe ein undefinierter Wert zurückgegeben. Die lokalen Variablen haben immer Vorrang vor den globalen Variablen mit demselben Namen.

0 Stimmen

Erstens: Danke an Sie und alle anderen hier, die mir so schnell die Antwort über Scoping gegeben haben, ich wusste nicht, dass alle Variablen vor der Ausführung nach oben verschoben werden. Aber es gibt einen Fehler in diesem, und das ist, wenn ich die Variable var globalId="ABC123" innerhalb der Funktion zu deklarieren, es immer noch meldet undefiniert. die Erklärung kann nicht an die Spitze verschoben worden sein, wenn dann sollte nicht meine Warnung haben "ABC123" statt undefiniert? So wie ich es sehe, verschiebt Javascript die Vorstellung, dass globalid deklariert werden WILL, und daher nicht darauf zugegriffen werden kann, bevor es getan wurde, wie es später im Code...?

7 Stimmen

@per Spjuth - nur die Erklärung wird nach oben verschoben, nicht die Zuordnung. Daher würden Sie immer noch undefiniert sein, wenn Sie die Zuweisung nicht vor dem Alert haben.

17voto

Gareth McCaughan Punkte 19600

Ja, alle Variablen, die irgendwo in einer Funktion deklariert werden, sind für diese Funktion lokal und existieren im gesamten Code der Funktion; sie werden vor den gleichnamigen globalen Variablen verwendet.

Von https://developer.mozilla.org/en/JavaScript/Guide/Values,_Variables,_and_Literals#Variable_Scope :

In JavaScript gibt es keinen Geltungsbereich für Blockanweisungen, sondern nur für den Code, in dem sich der Block befindet. [...] Eine weitere Besonderheit bei Variablen in JavaScript ist, dass man sich auf eine später deklarierte Variable beziehen kann, ohne eine Ausnahme zu erhalten. Dieses Konzept wird als "hoisting" bezeichnet; Variablen in JavaScript werden gewissermaßen "gehievt" oder an den Anfang der Funktion oder Anweisung gehoben.

13voto

Pascal MARTIN Punkte 384469

In Ihrem zweiten Teil des Codes überdeckt die lokale Variable die globale Variable.

var globalId='10';

function check() {
    // Your are defining a local variable in this function
    // so, the global one is not visible.
    alert(globalId);
    var globalId;
}

check(); 

Die Tatsache, dass Ihr var Anweisung am Ende der Funktionsdefinition steht, ändert sich nichts: die globale Variable wird maskiert für die gesamte Funktion .

Während der gesamten Ausführung der Funktion wird also die globalId auf die lokale und nicht auf die globale Variable verweisen.

Außerhalb dieser Funktion wird die globale Variable jedoch weiterhin existieren - sie wird nur nicht innerhalb der Funktion zu sehen sein, wegen der var Erklärung.

4voto

HBP Punkte 14860

Wie bereits gesagt, maskiert die lokale Variable gemäß den JavaScript-Scoping-Regeln die globale Variable für die gesamte Funktion. Wie auch immer man auf die globale Variable zugreifen kann, versuchen Sie Folgendes

var globalId='10';

function check() {
    // Your are defining a local variable in this function
    // so, the global one is not visible.
    alert('Local : ' + globalId + ', Global : ' + window.globalId);
    var globalId;
}

check();

0voto

Emmerman Punkte 2381

Deklarieren Sie die Variable NEW globalId innerhalb des Funktionsbereichs, so dass es undefiniert ist und dies korrekt ist. Und nein, es ist nicht töten Ihre globale Variable, können Sie es überprüfen, indem Sie hinzufügen alert(globalId); nach check(); anrufen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X