Без різниці. Вони обидва мають однаковий ефект (у браузері, де windowє глобальний контекст 1 ).
window.foo = "bar"встановлює властивість fooна window.
foo = "bar"позначає або друкарську помилку, або навмисно глобальну.
Оскільки мені доводиться ще раз перевіряти, чи це друкарська помилка, чи ні, я особисто вважаю, що це читабельніше встановлювати window.fooбезпосередньо.
Крім того, у суворому режимі ES5 foo = "bar"є незаконним призначенням, оскільки fooне задекларовано і викине a Error.
Редагувати:
Як зазначалося в коментарях, foo = "bar"буде шукати весь ланцюжок обсягу для змінної fooта повторно призначити її, "bar"якщо вона знайдена. Якщо його не знайти, він створить нову глобальну змінну.
Крім того, window.foo = "bar"ви просто присвоюєте властивість об'єкту, який можна видалити за допомогою delete window.foo.
У строгому режимі ES5 для змінної неприпустимоdelete .
1 В інших середовищах, таких як node.js та Web Workers, може існувати інша назва глобального об'єкта і windowможе взагалі не існувати. Використання Node.js globalта веб-працівників self.