Für den Umfang der Variablen übernehmen Sprachen wie C Java die Methode "Block Scope". Im Gegensatz dazu übernimmt JavaScript die Methode "Funktionsumfang" - der Umfang der Variablen wird nur durch die Funktion bestimmt, in der sie sich befindet, und hat nichts mit logischen Blöcken zu tun, wie z. B. wenn und für. Beispielsweise zeigt das folgende Beispiel die Verhaltensweisen in JavaScript, die sich von Sprachen wie C und Java unterscheiden:
Die Codekopie lautet wie folgt:
Funktion(){
var s = 42; // s ist während der gesamten Funktion sichtbar
if (s> 3) {
var x = "test"; // x ist während der gesamten Funktion sichtbar
für (var i = 0; i <10; i ++) {
console.log (i);
}
console.log (i); // ich ist während der gesamten Funktion sichtbar
}
console.log (i);
console.log (x);
}
In "Block Scope" -sprachen wie C und Java werden nach logischen Blöcken wie wenn Anweisungen und für Aussagen abgeschlossen, die in diesen logischen Blöcken definierten Variablen zerstört werden. JavaScript ist anders. Solange eine Variable in einer Funktion definiert ist, können alle Codes in der gesamten Funktion auf die Variable zugreifen, auch wenn die Codes vor der Variablendefinition vorliegen:
Die Codekopie lautet wie folgt:
Funktion(){
console.log (a); // undefiniert
var a = "test";
console.log (a); // test
}
Im obigen Beispiel wirft Console.log (a) ein ReferenzError. Wenn a in der Funktion definiert ist, ist der Anruf bei A auch dann, wenn diese Definition nach der A -Variablen -Anruferklärung erfolgt (wenn die Definition einer Variablen nach der Anruferklärung erfolgt, ist der Wert einer Variablen in der Call -Anweisung nicht definiert). Tatsächlich werden alle mit dem VAR -Schlüsselwort in der Funktion definierten Variablen zum Beginn der Funktion erhöht (die Zuordnungsoperation bleibt in der vom VAR definierten Zeile), die als Hebel in JavaScript bezeichnet wird. Zum Beispiel entspricht der obige Code:
Die Codekopie lautet wie folgt:
Funktion(){
var a;
console.log (a); // undefiniert
a = "test";
console.log (a); // test
}
Umfangskette von Variablen
Wenn Sie die Speicherung von Variablen in JavaScript in Verbindung setzen, können Sie ein gutes Verständnis des "Funktionsumfangs" und das Heben in JS ermöglichen. Da Variablen auf globalen Objekten oder Funktionen aufrufen, die eine Variable in einer Funktion definieren, werden unabhängig von der Variablen im Funktionsaufruf eine Eigenschaft mit demselben Namen wie diese Variable im Funktionsaufrufobjekt angezeigt, das von diesem Funktionsaufruf verwendet wird. Auf diese Weise kann die Variable überall in der Funktion zugegriffen werden.
Wenn es um Funktionsaufrufe geht, gibt es in JavaScript ein weiteres interessanteres Konzept: die Geltungskette von Variablen - da Variablen auf globalen Objekten oder Funktionsaufrufobjekten gespeichert sind, können Sie beim Zugriff auf Variablen Werte von mehreren Objekten abrufen. Der folgende Code ist ein Beispiel:
Die Codekopie lautet wie folgt:
var x = "test";
Funktion(){
// Level-1-Funktion
var x = "temp";
Funktion(){
// Level-2-Funktion
var x = "real";
// Versuchen Sie hier, auf X zugreifen zu können. X wird "echt" sein.
}
}
In der Funktion der Ebene 2 im obigen Code kann das Programm beim Versuch, auf die X -Variable zuzugreifen, nach den entsprechenden Attributwerten aus 3 Objekten zu suchen: das Funktionsaufrufobjekt, mit dem die Funktion der Stufe 2 verwendet wurde, das Funktionsaufrufobjekt, mit dem die Funktion der Ebene 1 aufgerufen wird, und das globale Objekt - gemäß dem von der Funktion des Funktionsobjekts und des Funktionsobjekts, und dem Funktionsobjekte, und dem Funktionsobjekt und dem Funktionsobjekt verwandelten Objekt. Beim Zugriff auf Variablen beginnt das Programm mit der Suche nach dem Objekt, das der Access -Anweisung am nächsten liegt. Wenn keine Suche gefunden wird, wird weiterhin im Objekt auf der vorherigen Ebene in der Objektkette bis zum globalen Objekt gesucht.
Da diese Objektkette mit dem Umfang der Variablen zusammenhängt, wird sie auch als "Scope -Kette" bezeichnet.
Wenn Sie die Bereichskette vorübergehend ändern und ein Objekt in das vordere Ende der Bereichskette einfügen müssen (als zuerst auf das Funktionsobjekt zugegriffen), können Sie die mit Anweisung verwenden:
Die Codekopie lautet wie folgt:
mit (o) {
// Code verwenden Eigenschaften des Objekts o.
}
Im JavaScript -strengen Modus sind jedoch mit Aussagen deaktiviert. Auch im Nichtstreifenmodus werden mit Aussagen nicht empfohlen.