Есть разница.
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-я редакция языка) есть так называемый «строгий режим» - языковой режим выбора, который немного меняет поведение незаявленных назначений. В строгом режиме присвоение необъявленному идентификатору является ReferenceError. Причиной этого было обнаружение случайных назначений, предотвращение создания нежелательных глобальных свойств. Некоторые из новых браузеров уже начали поддержку строгого режима. См., Например, мою таблицу совместимости.
person
kangax
schedule
24.09.2009
const
иlet
!var
- это не современный JS - person Gibolt   schedule 15.08.2017let
вместо _2 _ a > (из-за различий в поведенииlet
иvar
). - person Quentin   schedule 19.12.2019