Там разница .
var x = 1
объявляет переменную x
в текущей области видимости (или контекст выполнения). Если объявление появляется в функции - объявляется локальная переменная; если это в глобальной области видимости - объявлена глобальная переменная.
x = 1
с другой стороны, это просто присвоение свойства. Сначала он пытается разрешить x
цепочку областей видимости. Если он находит его где-нибудь в этой цепочке областей действия, он выполняет присваивание; если он не находит x
, только тогда он создает x
свойство для глобального объекта (который является объектом верхнего уровня в цепочке областей действия).
Теперь обратите внимание, что он не объявляет глобальную переменную, он создает глобальное свойство.
Разница между этими двумя тонкими и может сбить с толку, если вы не понимаете, что объявления переменных также создают свойства (только для объекта переменной) и что каждое свойство в Javascript (ну, ECMAScript) имеет определенные флаги, которые описывают их свойства - ReadOnly, DontEnum и DontDelete.
Поскольку объявление переменной создает свойство с флагом DontDelete, разница между var x = 1
и x = 1
(при выполнении в глобальной области видимости) заключается в том, что первый - объявление переменной - создает свойство DontDelete'able, а второй - нет. Как следствие, свойство, созданное с помощью этого неявного присвоения, затем может быть удалено из глобального объекта, а прежнее - созданное с помощью объявления переменной - не может быть удалено.
Но это, конечно, теория, и на практике между ними есть еще больше различий из-за различных ошибок в реализациях (таких как в IE).
Надеюсь, все это имеет смысл :)
[Обновление 2010/12/16]
В ES5 (ECMAScript 5; недавно стандартизированная, 5-я редакция языка) существует так называемый «строгий режим» - языковой режим opt-in, который немного меняет поведение необъявленных назначений. В строгом режиме присвоение необъявленного идентификатора является ReferenceError . Основанием для этого было отловить случайные присваивания, предотвращающие создание нежелательных глобальных свойств. Некоторые из новых браузеров уже начали активную поддержку строгого режима. Смотрите, например, мою таблицу сравнения .