Es gibt einen Unterschied .
var x = 1
deklariert eine Variable x
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ösung x
gegen die Bereichskette zu finden. Wenn es irgendwo in dieser Bereichskette gefunden wird, führt es eine Zuweisung durch. Wenn es nicht gefunden wird x
, erstellt es nur dann eine x
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
und x = 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 .