Dieses Phänomen ist bekannt als: JavaScript Variable Hoisting .
Sie greifen zu keinem Zeitpunkt auf die globale Variable in Ihrer Funktion zu. Sie greifen immer nur auf die lokale value
Variable zu.
Ihr Code entspricht dem Folgenden:
var value = 10;
function test() {
var value;
console.log(value);
value = 20;
console.log(value);
}
test();
Immer noch überrascht, dass Sie bekommen undefined
?
Erläuterung:
Dies ist etwas, auf das jeder JavaScript-Programmierer früher oder später stößt. Einfach ausgedrückt, was auch immer Variablen deklarieren Sie sind immer hochgezogen an die Spitze Ihrer lokalen Schließung. Obwohl Sie Ihre Variable nach dem ersten console.log
Aufruf deklariert haben , wird immer noch davon ausgegangen, dass Sie sie zuvor deklariert haben.
Es wird jedoch nur der Deklarationsteil gehisst; die Zuordnung ist dagegen nicht.
Als Sie das erste Mal aufgerufen haben console.log(value)
, haben Sie auf Ihre lokal deklarierte Variable verwiesen, der noch nichts zugewiesen wurde. daher undefined
.
Hier ist ein weiteres Beispiel :
var test = 'start';
function end() {
test = 'end';
var test = 'local';
}
end();
alert(test);
Was glaubst du, wird dies alarmieren? Nein, lesen Sie nicht einfach weiter, denken Sie darüber nach. Was ist der Wert von test
?
Wenn Sie etwas anderes sagten als start
, haben Sie sich geirrt. Der obige Code entspricht diesem:
var test = 'start';
function end() {
var test;
test = 'end';
test = 'local';
}
end();
alert(test);
so dass die globale Variable nie betroffen ist.
Wie Sie sehen, wird Ihre Variablendeklaration unabhängig davon, wo Sie sie ablegen, immer an die Spitze Ihres lokalen Verschlusses gehisst .
Randnotiz:
Dies gilt auch für Funktionen.
Betrachten Sie diesen Code :
test("Won't work!");
test = function(text) { alert(text); }
Das gibt Ihnen einen Referenzfehler:
Nicht erfasster ReferenceError: Test ist nicht definiert
Dies wirft viele Entwickler ab, da dieser Code gut funktioniert:
test("Works!");
function test(text) { alert(text); }
Der Grund dafür ist, wie angegeben, dass der Zuordnungsteil nicht angehoben wird. Im ersten Beispiel, als test("Won't work!")
es ausgeführt wurde, wurde die test
Variable bereits deklariert, ihr muss jedoch noch die Funktion zugewiesen werden.
Im zweiten Beispiel verwenden wir keine Variablenzuweisung. Vielmehr verwenden wir die richtige Funktionsdeklaration Syntax, die tut die Funktion bekommen vollständig gehisst.
Ben Cherry hat dazu einen ausgezeichneten Artikel mit dem passenden Titel JavaScript Scoping and Hoisting geschrieben .
Lies es. Sie erhalten das gesamte Bild im Detail.