Є різниця .
var x = 1
декларує змінну x
в поточному обсязі (він же контекст виконання). Якщо декларація з'являється у функції - оголошується локальна змінна; якщо це в глобальному масштабі - оголошується глобальна змінна.
x = 1
з іншого боку, це лише призначення власності. Спочатку вона намагається вирішити x
проти сфери застосування. Якщо він знайде його де-небудь у цьому діапазоні, він виконує завдання; якщо він не знаходить x
, тільки тоді він створює x
властивість для глобального об'єкта (який є об'єктом верхнього рівня в ланцюзі області).
Тепер зауважте, що вона не оголошує глобальну змінну, вона створює глобальну властивість.
Різниця між ними є тонкою і може бути заплутаною, якщо ви не розумієте, що декларації змінних також створюють властивості (лише на змінному об'єкті) і що кожна властивість у Javascript (ну, ECMAScript) має певні прапори, що описують їх властивості - ReadOnly, DontEnum та DontDelete.
Оскільки декларація змінної створює властивість за допомогою прапора DontDelete, різниця між var x = 1
та x = 1
(при виконанні в глобальному масштабі) полягає в тому, що колишня заява про змінну - створює властивість DontDelete'able, а остання - ні. Як наслідок, властивість, створене за допомогою цього неявного призначення, може бути видалено із глобального об'єкта, а попереднє - створене за допомогою змінної декларації - неможливо видалити.
Але це, звичайно, лише теорія, і на практиці є ще більше відмінностей між ними , через різні помилки у впровадженні (наприклад, у IE).
Сподіваюся, це все має сенс:)
[Оновлення 16.12.2010]
У ES5 (ECMAScript 5; нещодавно стандартизована, 5-е видання мови) існує так званий "суворий режим" - режим мовлення, який трохи змінює поведінку незадекларованих завдань. У жорсткому режимі присвоєння незадекларованому ідентифікатору є ReferenceError . Обґрунтуванням цього було прийняття випадкових завдань, запобігання створенню небажаних глобальних властивостей. Деякі нові браузери вже почали прокручувати підтримку суворого режиму. Дивіться, наприклад, мою таблицю compat .