Es gibt einen Unterschied.
var x = 1
deklariert Variable x
im aktuellen Scope (auch Ausführungskontext genannt). Wenn die Deklaration innerhalb einer Funktion erfolgt, wird eine lokale Variable deklariert; befindet sie sich im globalen Scope, wird eine globale Variable deklariert.
x = 1
hingegen ist lediglich eine Eigenschaftszuweisung. Zuerst versucht es, x
über den Scope-Chain aufzulösen. Wenn es sie irgendwo in diesem Scope-Chain findet, wird die Zuweisung durchgeführt; falls es x
nicht findet, wird nur dann die Eigenschaft x
auf einem globalen Objekt erstellt (welches das oberste Objekt im Scope-Chain ist).
Beachten Sie jetzt, dass es keine globale Variable deklariert, sondern eine globale Eigenschaft erstellt.
Der Unterschied zwischen den beiden ist subtil und kann verwirrend sein, es sei denn, Sie verstehen, dass Variable-Deklarationen auch Eigenschaften erstellen (nur auf einem Variablenobjekt) und dass jede Eigenschaft in Javascript (bzw. ECMAScript) bestimmte Flags hat, die ihre Eigenschaften beschreiben - ReadOnly, DontEnum und DontDelete.
Da die Variabledeklaration eine Eigenschaft mit dem Flag DontDelete erstellt, besteht der Unterschied zwischen var x = 1
und x = 1
(wenn sie im globalen Scope ausgeführt werden) darin, dass die erstere - die Variabledeklaration - die nicht löschbare Eigenschaft erstellt, und die letztere nicht. Als Konsequenz kann die über diese implizite Zuweisung erstellte Eigenschaft dann aus dem globalen Objekt gelöscht werden, und die erstere - die über die Variabledeklaration erstellte - kann nicht gelöscht werden.
Aber das ist natürlich nur Theorie, und in der Praxis gibt es noch mehr Unterschiede zwischen den beiden, aufgrund verschiedener Fehler in Implementierungen (wie die von IE).
Hoffentlich ergibt das alles Sinn : )
[Update 2010/12/16]
In ES5 (ECMAScript 5; kürzlich standardisiert, 5. Auflage der Sprache) gibt es einen sogenannten "Strict Mode" - ein optionaler Sprachmodus, der das Verhalten von nicht deklarierten Zuweisungen geringfügig ändert. Im Strict Mode führt eine Zuweisung an einen nicht deklarierten Bezeichner zu einem ReferenceError. Der Grund dafür war, versehentliche Zuweisungen zu erkennen und die Erstellung unerwünschter globaler Eigenschaften zu verhindern. Einige der neueren Browser haben bereits begonnen, Unterstützung für den Strict Mode zu implementieren. Siehe zum Beispiel meine Kompatibilitätstabelle.
6 Stimmen
Wenn Sie Variablendeklarationen verketten, beeinflusst das Einfügen einer neuen Zeile nach einem Komma das Verhalten? var x=1, y=2, [return]z=3;
6 Stimmen
Das Unterlassen von "var" macht Sie auch anfällig, falls der Variablenname, den Sie gewählt haben, zufällig eine zuvor definierte globale Variable ist. Sehen Sie hier meine Trauerreise: stackoverflow.com/questions/16704014/…
7 Stimmen
Der Melonenkarten-Blogbeitrag von @Ray Toal (definitiv lesenswert) wurde auf blog.safeshepherd.com/23/how-one-missing-var-ruined-our-launch verschoben.
2 Stimmen
Ich hatte mir nie vorstellen können, dass ein Gedicht mir Überlegungen zu einem programmatischen Problem inspirieren könnte.
3 Stimmen
Verwende
const
undlet
stattdessen!var
ist kein modernes JS.3 Stimmen
@Gibolt, aber schauen Sie sich das Frage-Datum an, es ist irgendwie unfair, eine Frage von 2009 heranzuziehen, um das zu sagen. Dennoch ist es auch für die aktuelle Datierung zur Wartbarkeit noch gültig, es gibt immer noch jede Menge nicht "modernen JS"-Code da draußen.
1 Stimmen
Die Hoffnung besteht darin, dass jemand, der meinen Kommentar liest und neu in JS ist (wahrscheinlich bei der Suche danach), frühzeitig lernt. Nur weil "nicht-moderner" Code existiert, bedeutet das nicht, dass wir weiterhin darauf bestehen sollten, dass es die richtige Antwort ist.
2 Stimmen
Bitte beachten Sie, dass Sie in modernem JavaScript normalerweise
let
anstelle vonvar
verwenden sollten (aufgrund der Unterschiede im Verhalten vonlet
undvar
).