Il y a une différence .
var x = 1
déclare une variable x
dans la portée actuelle (aka contexte d'exécution). Si la déclaration apparaît dans une fonction - une variable locale est déclarée; s'il est de portée globale - une variable globale est déclarée.
x = 1
, d'autre part, n'est qu'une cession de propriété. Il essaie d'abord de résoudre la x
chaîne de portée. S'il le trouve n'importe où dans cette chaîne de portée, il effectue une affectation; s'il ne trouve pas x
, alors seulement il crée une x
propriété sur un objet global (qui est un objet de niveau supérieur dans une chaîne de portée).
Maintenant, notez qu'il ne déclare pas de variable globale, il crée une propriété globale.
La différence entre les deux est subtile et peut être déroutante à moins que vous ne compreniez que les déclarations de variables créent également des propriétés (uniquement sur un objet variable) et que chaque propriété en Javascript (enfin, ECMAScript) a certains indicateurs qui décrivent leurs propriétés - ReadOnly, DontEnum et DontDelete.
Puisque la déclaration de variable crée une propriété avec l'indicateur DontDelete, la différence entre var x = 1
et x = 1
(lorsqu'elle est exécutée dans la portée globale) est que la première - déclaration de variable - crée la propriété DontDelete'able, et pas la dernière. Par conséquent, la propriété créée via cette affectation implicite peut ensuite être supprimée de l'objet global, et la première - celle créée via la déclaration de variable - ne peut pas être supprimée.
Mais ce n'est qu'une théorie bien sûr, et dans la pratique, il y a encore plus de différences entre les deux , en raison de divers bogues dans les implémentations (comme ceux d'IE).
J'espère que tout cela a du sens:)
[Mise à jour 2010/12/16]
Dans ES5 (ECMAScript 5; 5e édition du langage récemment normalisée), il existe un soi-disant «mode strict» - un mode de langue opt-in, qui modifie légèrement le comportement des affectations non déclarées. En mode strict, l'affectation à un identifiant non déclaré est une ReferenceError . La raison en était de capturer des affectations accidentelles, empêchant la création de propriétés globales indésirables. Certains des navigateurs les plus récents ont déjà commencé à prendre en charge le mode strict. Voir, par exemple, ma table compat .