Há uma diferença .
var x = 1
declara variável x
no escopo atual (também conhecido como contexto de execução). Se a declaração aparecer em uma função - uma variável local é declarada; se estiver no escopo global - uma variável global é declarada.
x = 1
, por outro lado, é apenas uma atribuição de propriedade. Primeiro, ele tenta resolver com x
relação à cadeia de escopo. Se o encontrar em qualquer lugar dessa cadeia de escopo, ele executará a atribuição; se não encontrar x
, somente cria x
propriedade em um objeto global (que é um objeto de nível superior em uma cadeia de escopo).
Agora, observe que ela não declara uma variável global, ela cria uma propriedade global.
A diferença entre os dois é sutil e pode ser confusa, a menos que você entenda que as declarações de variáveis também criam propriedades (apenas em um objeto variável) e que todas as propriedades em Javascript (bem, ECMAScript) possuem determinados sinalizadores que descrevem suas propriedades - ReadOnly, DontEnum e Não exclua.
Como a declaração de variável cria propriedade com o sinalizador DontDelete, a diferença entre var x = 1
e x = 1
(quando executada no escopo global) é que a primeira - declaração de variável - cria a propriedade DontDelete'able, e a segunda não. Como conseqüência, a propriedade criada por meio dessa atribuição implícita pode ser excluída do objeto global e a anterior - a criada por meio da declaração de variável - não pode ser excluída.
Mas isso é apenas teoria, é claro, e na prática há ainda mais diferenças entre os dois , devido a vários erros nas implementações (como as do IE).
Espero que tudo faça sentido :)
[Atualização 16/12/2010]
No ES5 (ECMAScript 5; recentemente padronizado, 5ª edição do idioma), existe o chamado "modo estrito" - um modo de idioma de aceitação, que altera levemente o comportamento de atribuições não declaradas. No modo estrito, a atribuição a um identificador não declarado é um ReferenceError . A lógica para isso era capturar atribuições acidentais, impedindo a criação de propriedades globais indesejadas. Alguns dos navegadores mais recentes já começaram a rolar o suporte ao modo estrito. Veja, por exemplo, minha tabela compat .