Unabhängig davon, wo eine JavaScript-Variablendeklarationsanweisung erscheint, wird sie zuerst vor anderem Code ausgeführt. Der Gültigkeitsbereich einer mit dem Schlüsselwort var deklarierten Variablen ist der aktuelle Ausführungskontext, bei dem es sich um eine umgebende Funktion oder, wenn die Variable außerhalb des Funktionskörpers deklariert wird, um eine globale Variable handeln kann.
Dinge, die außerhalb des Funktionskörpers definiert sind, sind globale Variablen, und Dinge, die innerhalb des Funktionskörpers definiert sind, sind lokale Variablen. Die Definition hier bezieht sich auf die Deklaration durch var.
JavaScript verfügt über das Konzept impliziter Globals, was bedeutet, dass jede Variable, die Sie nicht deklarieren, zu einer globalen Objekteigenschaft wird. Zum Beispiel:
function test(){ myname = "huming"; alert(myname); } test(); // "huming" alert(myname); //"huming"
Die beiden Ergebnisse sind gleich, was darauf hinweist, dass myname eine globale Variable ist.
Gibt es also einen Unterschied zwischen impliziten globalen Variablen und explizit definierten globalen Variablen? . Die Antwort lautet definitiv „Ja“, sehen Sie sich das Beispiel unten an:
// 定义三个全局变量 var global_test = ; global_test = ; // 反面教材 (function () { global_test = ; // 反面教材 }()); // 试图删除 delete global_test; // false delete global_test; // true delete global_test; // true // 测试该删除 alert(typeof global_test); // "number" alert(typeof global_test); // "undefined" alert(typeof global_test); // "undefined"
Wie aus dem obigen Beispiel ersichtlich ist, kann global_test1, das durch var außerhalb der Funktion definiert ist, nicht gelöscht werden, und global_test2 und global_test3, die nicht durch var definiert sind, werden gelöscht (unabhängig davon, ob sie innerhalb des Funktionskörpers erstellt werden).
Zusammenfassend lässt sich sagen, dass globale Variablen, die über var außerhalb der Funktion deklariert wurden, nicht gelöscht werden können, implizite globale Variablen jedoch.
Hier ist zu beachten: JavaScript hat ein Verhalten namens „Hoisting“ (Suspendieren/Top-Parsing/Vorparsing).
Lassen Sie es uns anhand eines Beispiels veranschaulichen:
var myname = "huming"; //声明全局变量 function test() { alert(myname); var myname = "local_huming"; alert(myname); } test();
Glauben Sie, dass die Inhalte der beiden Warnungen konsistent sind? ? Offensichtlich inkonsistent, natürlich konsistent. . Die tatsächliche Ausgabe ist: „undefiniert“, „local_huming“.
Das obige Beispiel entspricht
var myname = "huming"; //声明全局变量 function test() { var myname; alert(maname);<br> myname = "local_huming"; alert(myname); // "local" } test();
Der von der ersten Warnung ausgegebene myname ist nicht die globale Variable, die Sie vermuten, sondern eine lokale Variable im selben Gültigkeitsbereich (ein Funktionskörper). Obwohl es nicht deklariert wurde, wird es als solches behandelt. Dies nennt man „Heben“.
Das sollte es klarstellen. Wenn Sie eine Variable in einem Funktionskörper verwenden und sie später erneut deklarieren, kann ein Fehler auftreten.
Schreibvorgaben:
function test() { var a = , b = , c = a + b, d = {}, e, f; // function body... }
Die Vorteile sind:
1. Alle lokalen Variablen werden zur einfachen Suche am Anfang der Funktion definiert;
In JavaScript gibt es vier Möglichkeiten für einen Variablennamen, in den Gültigkeitsbereich einzutreten
In die Sprache integriert, alle Bereiche verfügen über die Schlüsselwörter this und arguments
Die vier oben aufgeführten Reihenfolgen sind auch die Reihenfolge der Priorität von hoch nach niedrig. Sobald ein Variablenname deklariert wurde, kann er nicht durch andere Variablendeklarationsformen mit niedrigerer Priorität überschrieben werden.