C'è una differenza .
var x = 1
dichiara variabile x
nell'ambito corrente (aka contesto di esecuzione). Se la dichiarazione appare in una funzione - viene dichiarata una variabile locale; se è nell'ambito globale, viene dichiarata una variabile globale.
x = 1
d'altra parte, è semplicemente un'assegnazione di proprietà. Prima prova a risolvere la x
catena dell'ambito. Se lo trova ovunque in quella catena di portata, esegue l'assegnazione; se non lo trova x
, solo allora crea x
proprietà su un oggetto globale (che è un oggetto di livello superiore in una catena di ambito).
Ora, nota che non dichiara una variabile globale, crea una proprietà globale.
La differenza tra i due è sottile e potrebbe essere fonte di confusione a meno che non si capisca che le dichiarazioni di variabili creano anche proprietà (solo su un oggetto variabile) e che ogni proprietà in Javascript (bene, ECMAScript) ha alcuni flag che descrivono le loro proprietà - ReadOnly, DontEnum e DontDelete.
Poiché la dichiarazione di variabile crea proprietà con il flag DontDelete, la differenza tra var x = 1
e x = 1
(se eseguita in ambito globale) è che la prima - la dichiarazione di variabile - crea la proprietà DontDelete e quest'ultima no. Di conseguenza, la proprietà creata tramite questa assegnazione implicita può quindi essere eliminata dall'oggetto globale e la prima, quella creata tramite una dichiarazione variabile, non può essere eliminata.
Ma questa è ovviamente solo teoria, e in pratica ci sono ancora più differenze tra i due , a causa di vari bug nelle implementazioni (come quelli di IE).
Spero che tutto abbia un senso:)
[Aggiornamento 2010/12/16]
In ES5 (ECMAScript 5, recentemente standardizzato, 5a edizione della lingua) c'è una cosiddetta "modalità rigorosa" - una modalità di lingua opt-in, che modifica leggermente il comportamento delle assegnazioni non dichiarate. In modalità rigorosa, l'assegnazione a un identificatore non dichiarato è un ReferenceError . La logica di ciò era catturare incarichi accidentali, impedendo la creazione di proprietà globali indesiderate. Alcuni dei browser più recenti hanno già avviato il supporto per la modalità rigorosa. Vedi, ad esempio, la mia tabella di compatibilità .