Es gibt einen Unterschied .
var x = 1
deklariert die Variable x
im aktuellen Bereich (auch Ausführungskontext genannt). Wenn die Deklaration in einer Funktion erscheint, wird eine lokale Variable deklariert; wenn sie sich im globalen Bereich befindet, wird eine globale Variable deklariert.
x = 1
ist dagegen lediglich eine Eigentumsübertragung. Sie versucht zunächst, die x
gegen Umfangskette. Wenn es irgendwo in der Bereichskette gefunden wird, führt es die Zuweisung durch; wenn es nichts findet, wird x
erst dann wird es schafft x
Eigenschaft bei einem globalen Objekt (das ein Objekt der obersten Ebene in einer Bereichskette ist).
Beachten Sie, dass hier keine globale Variable deklariert, sondern eine globale Eigenschaft erstellt wird.
Der Unterschied zwischen den beiden ist fein und könnte verwirrend sein, wenn Sie nicht verstehen, dass Variablendeklarationen erzeugen auch Eigenschaften (nur bei einem variablen Objekt) und dass jede Eigenschaft in Javascript (nun, ECMAScript) bestimmte Flags hat, die ihre Eigenschaften beschreiben - ReadOnly, DontEnum und DontDelete.
Da die Variablendeklaration eine Eigenschaft mit dem DontDelete-Flag erzeugt, ist der Unterschied zwischen var x = 1
y x = 1
(wenn sie im globalen Bereich ausgeführt wird) ist, dass die erste - die Variablendeklaration - die Eigenschaft DontDelete'able erzeugt, die zweite nicht. Infolgedessen kann die durch diese implizite Zuweisung erstellte Eigenschaft aus dem globalen Objekt gelöscht werden, während die erstere - die durch die Variablendeklaration erstellte - nicht gelöscht werden kann.
Aber das ist natürlich nur Theorie, und in der Praxis gibt es noch mehr Unterschiede zwischen den beiden aufgrund verschiedener Fehler in den Implementierungen (z. B. des IE).
Ich hoffe, das macht alles Sinn : )
[Update 2010/12/16]
In ES5 (ECMAScript 5; kürzlich standardisierte, 5. Ausgabe der Sprache) gibt es einen so genannten "Strict Mode" - einen Opt-in-Sprachmodus, der das Verhalten von nicht deklarierten Zuweisungen leicht verändert. Im "strict mode" ist die Zuweisung an einen nicht deklarierten Bezeichner ein ReferenceError . Der Grund dafür war, dass versehentliche Zuweisungen abgefangen und die Erstellung unerwünschter globaler Eigenschaften verhindert werden sollte. Einige der neueren Browser haben bereits damit begonnen, den Strict-Modus zu unterstützen. Siehe zum Beispiel, meine Kompatibilitätstabelle .