HINWEIS : Diese Frage wurde aus Sicht von ECMAScript Version 3 oder 5 gestellt. Die Antworten könnten mit der Einführung neuer Funktionen in der Version von ECMAScript 6 veraltet sein.
Was genau ist die Funktion des var
Schlüsselworts in JavaScript und was ist der Unterschied zwischen
var someNumber = 2;
var someFunction = function() { doSomething; }
var someObject = { }
var someObject.someProperty = 5;
und
someNumber = 2;
someFunction = function() { doSomething; }
someObject = { }
someObject.someProperty = 5;
?
Wann würden Sie eines von beiden verwenden und warum / was macht es?
Antworten:
Wenn Sie sich im globalen Bereich befinden, gibt es keinen großen Unterschied. Lesen Sie Kangax ' Antwort zur Erklärung
Wenn Sie sich in einer Funktion befinden,
var
wird eine lokale Variable erstellt. "No var" sucht in der Bereichskette, bis die Variable gefunden wird oder der globale Bereich erreicht wird (an diesem Punkt wird sie erstellt):Wenn Sie keine Aufgabe ausführen, müssen Sie Folgendes verwenden
var
:quelle
Es gibt einen Unterschied .
var x = 1
deklariert eine Variablex
im aktuellen Bereich (auch als Ausführungskontext bezeichnet). Wenn die Deklaration in einer Funktion erscheint, wird eine lokale Variable deklariert. Wenn es sich im globalen Bereich befindet, wird eine globale Variable deklariert.x = 1
ist dagegen lediglich eine Eigenschaftszuweisung. Es wird zunächst versucht, eine Lösungx
gegen die Bereichskette zu finden. Wenn es irgendwo in dieser Bereichskette gefunden wird, führt es eine Zuweisung durch. Wenn es nicht gefunden wirdx
, erstellt es nur dann einex
Eigenschaft für ein globales Objekt (das ein Objekt der obersten Ebene in einer Bereichskette ist).Beachten Sie nun, dass keine globale Variable deklariert wird, sondern eine globale Eigenschaft erstellt wird.
Der Unterschied zwischen den beiden ist subtil und kann verwirrend sein, es sei denn, Sie verstehen, dass Variablendeklarationen auch Eigenschaften erstellen (nur für ein Variablenobjekt) und dass jede Eigenschaft in Javascript (also ECMAScript) bestimmte Flags hat, die ihre Eigenschaften beschreiben - ReadOnly, DontEnum und Nicht löschen.
Da die Variablendeklaration eine Eigenschaft mit dem DontDelete-Flag erstellt, besteht der Unterschied zwischen
var x = 1
undx = 1
(bei Ausführung im globalen Bereich) darin, dass die erstere - die Variablendeklaration - die DontDelete'able-Eigenschaft erstellt und die letztere nicht. Infolgedessen kann die über diese implizite Zuweisung erstellte Eigenschaft aus dem globalen Objekt gelöscht werden, und die erstere - die über die Variablendeklaration erstellte - kann nicht gelöscht werden.Dies ist natürlich nur eine Theorie, und in der Praxis gibt es aufgrund verschiedener Fehler in Implementierungen (z. B. von IE) noch mehr Unterschiede zwischen den beiden .
Hoffe alles macht Sinn :)
[Update 16.12.2010]
In ES5 (ECMAScript 5; kürzlich standardisierte 5. Ausgabe der Sprache) gibt es einen sogenannten "strengen Modus" - einen Opt-In-Sprachmodus, der das Verhalten nicht deklarierter Zuweisungen geringfügig ändert. Im strengen Modus ist die Zuweisung zu einem nicht deklarierten Bezeichner ein ReferenceError . Der Grund dafür war, versehentliche Zuweisungen zu erfassen und die Schaffung unerwünschter globaler Eigenschaften zu verhindern. Einige der neueren Browser haben bereits damit begonnen, den strengen Modus zu unterstützen. Siehe zum Beispiel meine kompatible Tabelle .
quelle
delete
mit einemeval
Hack zu einer var-deklarierten Variablen zu gelangen . Wenn ich mich an den genauen Trick erinnere, werde ich hier posten.var someObject = {}
undsomeObject.someProperty = 5
? WürdesomeProperty
global werden, während das Objekt, dessen Eigentum es ist, lokal bleibt?false
) . Sie können dies in Bezug aufObject.defineProperty
undObject.getOwnPropertyDescriptor
Zu sagen, dass es der Unterschied zwischen " lokal und global " ist, ist nicht ganz richtig.
Es könnte besser sein, es als den Unterschied zwischen " lokal und am nächsten " zu betrachten. Der nächste kann sicherlich global sein, aber das wird nicht immer der Fall sein.
quelle
outer
Sie definierenvar global = false;
?var global = local;
in ändern würden. In diesem Fall wäre der Near-Bereich von Local der "lokale" äußere Bereich, der aktiv definiert wird. Es wird jedoch seltsam, wenn Sie dieselbe Zeilevar global = global
in ändern. In diesem Fall liegt der nächste Bereich bei der Suche nach dem Wert vonglobal
im globalen Fensterbereich auf einer höheren Ebene.Wenn Javascript in einem Browser ausgeführt wird, ist Ihr gesamter Code von einer with-Anweisung umgeben, wie folgt:
Weitere Infos zu
with
- MDNDa
var
eine Variable im aktuellen Bereich deklariert wird , gibt es keinen Unterschied zwischen der Deklarationvar
innerhalb des Fensters und der Deklaration überhaupt nicht.Der Unterschied entsteht, wenn Sie sich nicht direkt im Fenster befinden, z. B. innerhalb einer Funktion oder innerhalb eines Blocks.
Mit
var
können Sie externe Variablen mit demselben Namen ausblenden. Auf diese Weise können Sie eine "private" Variable simulieren, aber das ist ein anderes Thema.Als Faustregel gilt, immer zu verwenden
var
, da sonst die Gefahr besteht, dass subtile Fehler auftreten.EDIT: Nach den Kritiken, die ich erhalten habe, möchte ich Folgendes hervorheben:
var
deklariert eine Variable im aktuellen Bereichwindow
var
implizite Deklarationenvar
im globalen Bereich (Fenster) verwendenvar
ist dasselbe wie das Weglassen.var
ist nicht dasselbe wie das Deklarieren einer Variablen ohnevar
var
explizit deklarieren, da dies eine gute Praxis istquelle
let
in ES6 veraltet .Verwenden Sie immer das
var
Schlüsselwort, um Variablen zu deklarieren. Warum? Eine gute Codierungspraxis sollte an sich schon ein Grund genug sein, aber wenn sie weggelassen wird, bedeutet dies, dass sie im globalen Bereich deklariert ist (eine Variable wie diese wird als "implizite" globale bezeichnet). Douglas Crockford empfiehlt, niemals implizite Globale zu verwenden und gemäß den Apple JavaScript Coding Guidelines :quelle
good coding practice
ist immer ein ausreichender Grund, wenn es sich um eine empfohlene Best Practice handelt, die von mehreren Javascript-Autoren verwendet wird.Hier ist ein gutes Beispiel dafür, wie Sie davon abgehalten werden können, lokale Variablen nicht zu deklarieren mit
var
:(
i
wird bei jeder Iteration der Schleife zurückgesetzt, da sie nicht lokal in derfor
Schleife, sondern global deklariert wird ), was schließlich zu einer Endlosschleife führtquelle
Ich würde sagen, es ist besser,
var
in den meisten Situationen zu verwenden.Lokale Variablen sind immer schneller als die Variablen im globalen Bereich.
Wenn Sie keine
var
Variable deklarieren, befindet sich die Variable im globalen Bereich.Für weitere Informationen können Sie in Google nach "Scope Chain JavaScript" suchen.
quelle
Nicht benutzen
var
!var
war die Möglichkeit vor ES6, eine Variable zu deklarieren. Wir sind jetzt in der Zukunft , und Sie sollten als solche codieren.Verwenden Sie
const
undlet
const
sollte in 95% der Fälle verwendet werden. Dadurch kann sich die Variablenreferenz nicht ändern, sodass sich die Eigenschaften von Arrays, Objekten und DOM-Knoten ändern können und wahrscheinlich auch ändern solltenconst
.let
sollte für jede Variable verwendet werden, die eine Neuzuweisung erwartet. Dies schließt innerhalb einer for-Schleife ein. Wenn Sie jemalsvarName =
über die Initialisierung hinaus schreiben , verwenden Sielet
.Beide haben Block-Level-Scoping, wie in den meisten anderen Sprachen erwartet.
quelle
ein weiterer Unterschied, z
während
quelle
var
?var a
an den oberen Rand des Bereichs angehoben und auf null gesetzt wird, wodurch die Variable deklariert, aber nicht initialisiert wird. In der Zuweisung haben Sie einen Verweis auf eine undefinierte Nullvariable, die als false ausgewertet wird, und setzen die Zuweisung auf[]
. In letzterem haben Sie eine Zuordnung zum Eigentuma
des Eigentumsa
. Sie können einer Eigenschaft zuweisen, die nicht vorhanden ist - indem Sie sie bei Zuweisung erstellen, aber Sie können nicht aus einer Eigenschaft lesen, die nicht vorhanden ist, ohne dass einReferenceError
Wurf auf Sie geworfen wird.Die Verwendung
var
ist immer eine gute Idee, um zu verhindern, dass Variablen den globalen Bereich überladen und Variablen in Konflikt miteinander geraten, was zu unerwünschtem Überschreiben führt.quelle
Ohne
var
- globale Variable.Es wird dringend empfohlen, IMMER eine
var
Anweisung zu verwenden, da die globale Variable init im lokalen Kontext böse ist. Wenn Sie diesen schmutzigen Trick benötigen, sollten Sie am Anfang der Seite einen Kommentar schreiben:quelle
Dies ist ein Beispielcode, den ich geschrieben habe, damit Sie dieses Konzept verstehen:
quelle
@ Chris S gab ein schönes Beispiel, das den praktischen Unterschied (und die Gefahr) zwischen
var
und nein zeigtvar
. Hier ist eine andere, ich finde diese besonders gefährlich, da der Unterschied nur in einer asynchronen Umgebung sichtbar ist, so dass er beim Testen leicht vorbeigehen kann.Wie zu erwarten, die folgenden Snippet-Ausgaben
["text"]
:So auch das folgende Snippet (beachten Sie das fehlende
let
vorherarray
):Das asynchrone Ausführen der Datenmanipulation führt immer noch zu demselben Ergebnis mit einem einzelnen Executor:
Aber verhält sich bei mehreren anders:
Verwenden Sie jedoch:
quelle
Als jemand, der versucht, dies zu lernen, sehe ich das so. Die obigen Beispiele waren für einen Anfänger vielleicht etwas zu kompliziert.
Wenn Sie diesen Code ausführen:
Die Ausgabe lautet wie folgt: false, false, true, true
Weil die Variablen in der Funktion als von denen außerhalb der Funktion getrennt angesehen werden, daher der Begriff lokale Variable, und dies lag daran, dass wir var in der Zuweisung verwendet haben. Wenn Sie die Variable in der Funktion entfernen, lautet sie jetzt wie folgt:
Die Ausgabe ist falsch, falsch, falsch, falsch
Dies liegt daran, dass anstatt eine neue Variable im lokalen Bereich oder in der lokalen Funktion zu erstellen, einfach die globalen Variablen verwendet und sie false zugewiesen werden.
quelle
Ich sehe, dass Leute verwirrt sind, wenn sie Variablen mit oder ohne var und innerhalb oder außerhalb der Funktion deklarieren . Hier ist ein tiefes Beispiel, das Sie durch diese Schritte führt:
Sehen Sie das Skript unten in Aktion hier bei jsfiddle
quelle
Wenn Sie in einem Code eine Variable verwenden, ohne var zu verwenden, wird automatisch der var var_name in den globalen Bereich eingefügt, z.
quelle
Neben dem Thema Scopes erwähnen einige Leute auch das Heben , aber niemand gab ein Beispiel. Hier ist eine für den globalen Geltungsbereich:
quelle
Ohne Verwendung von "var" können Variablen nur definieren, wenn ein Wert festgelegt wird. Zum Beispiel:
kann nicht im globalen oder einem anderen Bereich arbeiten . Es sollte einen Wert haben wie:
Auf der anderen Seite können Sie ein vaiable like definieren;
Sein Wert ist
undefined
(Sein Wert ist nichtnull
und es ist nicht gleichnull
interessant.).quelle
my_var;
ist eigentlich eine gültige Ausdrucksanweisung.my_var;
ist eine gültige Ausdrucksanweisung ./my_var;
wäre eine ungültige Aussage. Aber wie gesagt, das ist Grammatik-Kasuistik, ich entschuldige mich, mein Kommentar war eigentlich nicht angebracht.Sie sollten das Schlüsselwort var verwenden, es sei denn, Sie möchten, dass die Variable im Browser an das Fensterobjekt angehängt wird. Hier ist ein Link, der das Scoping und den Unterschied zwischen glokalem Scoping und lokalem Scoping mit und ohne var-Schlüsselwort erklärt.
Wenn Variablen ohne Verwendung des Schlüsselworts var definiert werden, sieht es nach einer einfachen Zuweisungsoperation aus.
Wenn der Wert einer Variablen in Javascript zugewiesen wird, versucht der Interpreter zunächst, die „Variablendeklaration“ im selben Kontext / Bereich wie die Zuweisung zu finden. Wenn der Interpreter ausgeführt wird
dummyVariable = 20
, sucht er zu Beginn der Funktion nach der Deklaration von dummyVariable. (Da alle Variablendeklarationen vom Javascript-Interpreter an den Anfang des Kontexts verschoben werden und dies als Heben bezeichnet wird)Vielleicht möchten Sie auch das Heben in Javascript betrachten
quelle