Warum wird eine schattierte Variable zu einem nicht definierten Wert ausgewertet, wenn sie außerhalb des Gültigkeitsbereichs definiert ist?

8

Betrachten Sie den folgenden Code:

%Vor%

Die Ausgabe für diesen Code ist, dass die Alarmbox die Nachricht "outside" anzeigt scope ". Aber, wenn ich den Code leicht als ändern:

%Vor%

Die Warnmeldung zeigt die Meldung " undefined " an. ich könnte haben verstehe die Logik, wenn sie in beiden Fällen "undefiniert" anzeigt. Aber das passiert nicht. Es zeigt "undefined" nur im zweiten Fall an. Warum ist das?

Vielen Dank im Voraus für Ihre Hilfe!

    
BeachRunnerFred 06.10.2009, 21:57
quelle

6 Antworten

12

Im ersten Fall greift Ihr Code auf die globale Variable "outside_scope" zu, die auf "outside scope" initialisiert wurde.

Javascript hat einen Funktionsebenenbereich, im zweiten Fall greift es auf die Funktionsumfangsvariable "outside_scope" zu, aber es wurde zum Zeitpunkt der Alarmbox noch nicht initialisiert. Es wird also undefined angezeigt.

    
jsight 06.10.2009, 22:02
quelle
20

Variablen unterliegen dem Hochziehen . Dies bedeutet, dass unabhängig davon, wo eine Variable in einer Funktion platziert wird, diese an den Anfang des Bereichs verschoben wird, in dem sie definiert ist.

Zum Beispiel:

%Vor%

Wird interpretiert in:

%Vor%

Aus diesem Grund und dem Funktionsumfang von JavaScript wird empfohlen, alle Variablen auf der Oberseite des zu deklarieren Funktion , um zu ähneln, was passieren wird.

    
CMS 06.10.2009 22:09
quelle
5

JavaScript hat einen Funktionsumfang, keinen Blockbereich.

Im zweiten Fall wird die Deklaration von outside_scope bis zum Anfang der Funktion hochgezogen (aber die Zuweisung ist nicht).

Dies ist ein gutes Beispiel dafür, warum JavaScript-Code einfacher zu lesen ist, wenn Sie alle Ihre Variablendeklarationen oben an die Funktion setzen. Ihr zweites Beispiel entspricht:

%Vor%

und Sie können wahrscheinlich jetzt verstehen, warum Sie "undefiniert" bekommen.

    
Nosredna 06.10.2009 22:07
quelle
4

Im zweiten Beispiel existiert die lokale Variable für den gesamten Funktionsumfang. Es spielt keine Rolle, dass Sie es nach der Warnung definiert haben, es existiert für die gesamte Funktion.

Die eigentliche Zuweisung erfolgt jedoch erst nach dem Alert, daher "undefined".

    
developmentalinsanity 06.10.2009 22:04
quelle
1

Das ist ein interessanter Fall.

Im ersten Beispiel haben Sie eine globale Variable definiert. es hat einen globalen Gültigkeitsbereich und ist daher in jeder Funktion / jedem Objekt für die Ausführung zugänglich.

Im zweiten Beispiel haben Sie die globale Variable mit der Funktion scope-Variable "blockiert", aber da sie zum Zeitpunkt des Alerts noch nicht initialisiert wurde, gibt sie 'undefined' zurück.

ich stimme zu, das ist nicht die intuitivste Eigenart, aber es macht Sinn.

    
pstanton 06.10.2009 22:04
quelle
1

Dies ist auf etwas zurückzuführen, das Hochladen von Variablendeklarationen genannt wird.

Grundsätzlich trennt JavaScript eine Variablendeklaration in zwei und überläßt die Zuweisung, in der Sie die Deklaration ausgeführt und die tatsächliche Deklaration auf oben auf der Funktion gesetzt haben:

%Vor%

Zur Laufzeit wird f1() in f2() übersetzt. Ich habe einen ausführlichen Blogeintrag über diese hier geschrieben. Ich hoffe, das hilft dir zu verstehen, was in deinem Code passiert.

Dies ist auch der Grund, es wird empfohlen, Ihre Variablen am Anfang einer Funktion in JavaScript zu deklarieren. Es hilft Ihnen zu verstehen, was der Code tut, wenn es ausgeführt wird.

    
Pierre Spring 24.05.2010 12:10
quelle

Tags und Links