Hay una diferencia .
var x = 1
declara variable x
en el alcance actual (también conocido como contexto de ejecución). Si la declaración aparece en una función, se declara una variable local; si está en alcance global, se declara una variable global.
x = 1
, por otro lado, es simplemente una asignación de propiedad. Primero intenta resolver x
contra la cadena de alcance. Si lo encuentra en algún lugar de esa cadena de alcance, realiza la asignación; si no encuentra x
, solo entonces crea una x
propiedad en un objeto global (que es un objeto de nivel superior en una cadena de alcance).
Ahora, observe que no declara una variable global, crea una propiedad global.
La diferencia entre los dos es sutil y puede ser confusa a menos que comprenda que las declaraciones de variables también crean propiedades (solo en un Objeto variable) y que cada propiedad en Javascript (bueno, ECMAScript) tiene ciertos indicadores que describen sus propiedades: ReadOnly, DontEnum y No borrar
Como la declaración variable crea una propiedad con el indicador DontDelete, la diferencia entre var x = 1
yx = 1
(cuando se ejecuta en alcance global) es que la primera, la declaración variable, crea la propiedad DontDelete'able, y la segunda no. Como consecuencia, la propiedad creada a través de esta asignación implícita se puede eliminar del objeto global, y la primera, la creada mediante declaración de variable, no se puede eliminar.
Pero esto es solo teoría, por supuesto, y en la práctica hay aún más diferencias entre los dos , debido a varios errores en las implementaciones (como las de IE).
Espero que todo tenga sentido :)
[Actualización 2010/12/16]
En ES5 (ECMAScript 5; recientemente estandarizado, 5ta edición del lenguaje) hay un llamado "modo estricto" - un modo de lenguaje opcional, que cambia ligeramente el comportamiento de las tareas no declaradas. En modo estricto, la asignación a un identificador no declarado es un Error de referencia . La razón de esto fue detectar asignaciones accidentales, evitando la creación de propiedades globales no deseadas. Algunos de los navegadores más nuevos ya han comenzado a admitir el modo estricto. Ver, por ejemplo, mi tabla compat .