В чем разница между глобальным var и window.variable в javascript?

javascript attributes scope

27992 просмотра

6 ответа

61401 Репутация автора

Я читаю документы backbone.js и вижу много кода, который присваивает атрибуты объекту окна:

window.something = "whatever";

какая разница между вызовом этого кода и просто назначением переменной и созданием глобальной переменной, например так:

something = "whatever";

Я предполагаю, что есть какая-то другая область видимости, и / или разница в владении объектом (окно является владельцем, а не нет), но меня интересует детали между ними и почему я бы использовал окно, а не его использование.

Автор: Derick Bailey Источник Размещён: 14.06.2011 07:51

Ответы (6)


68 плюса

139304 Репутация автора

Решение

Нет разницы. Они оба имеют одинаковый эффект (в браузере, где windowнаходится глобальный контекст 1 ).

  • window.foo = "bar"устанавливает свойство fooна window.
  • foo = "bar"обозначает либо опечатку, либо намеренно глобально.

Так как я должен проверить дважды ли это опечатка или нет, лично я считаю его более читаемым для установки window.fooнепосредственно.

Кроме того, в строгом режиме ES5 foo = "bar"это недопустимое назначение, поскольку fooоно не объявлено и будет выдано Error.

Редактировать:

Как отмечено в комментариях, foo = "bar"будет искать всю цепочку областей действия для переменной fooи переназначать ее, "bar"если она найдена. Если он не найден, он создаст новую глобальную переменную.

Также window.foo = "bar"вы просто назначаете объекту свойство, которое можно удалить с помощью delete window.foo.

В ES5 строгом режиме она недействительна с deleteпеременной.


1 В других средах, таких как node.js и Web Workers, для глобального объекта может быть другое имя, которое windowможет вообще не существовать. Node.js использует globalи веб-работники используют self.

Автор: Raynos Размещён: 14.06.2011 07:53

2 плюса

13449 Репутация автора

Разница в том, что window.foo = bar;не может быть перехвачен рефакторингом, сделанным позже. Использование foo = bar;означает, что если на более позднем этапе код будет перемещен в замыкание, где var fooон был определен, он больше не будет устанавливать его в глобальном объекте.

Автор: david Размещён: 14.06.2011 07:58

5 плюса

2865 Репутация автора

Ключ, на который ссылался Райнос, заключается в том, что он явно задан для объекта window. В браузере глобальный объект такой же, как объект окна, но в других средах (например, node.js или, возможно, работает в каком-либо веб-представлении на мобильном устройстве), это может быть не так.

Автор: ScottKoon Размещён: 14.06.2011 08:04

8 плюса

35929 Репутация автора

Они оба делают одно и то же.
Но, получая доступ к windowсвойству, вы точно знаете, что обращаетесь к глобальной переменной независимо от того, в какой области вы находитесь.
Например:

globalVar = "smth";
function(){
    var globalVar = 2;
    alert(globalVar);// points to the current scope globalVar
    alert(window.globalVar);// points to the original globalVar
}

Другими словами, если вы хотите работать с глобальными переменными, несколько безопаснее получить к ним доступ через их контейнер: window.variable

Автор: gion_13 Размещён: 14.06.2011 08:14

0 плюса

3123 Репутация автора

Добавление еще одного пункта:

Если вы ссылаетесь на необъявленную переменную напрямую (без использования - window или typeof ), тогда вы получите переменную не определенная ошибка .

Примеры:

// var unDecVariable

if (unDecVariable != null) // Error: unDecVariable is not defined
{
    // do something
}

if (window.unDecVariable != null) // No Error
{
    // do something
}

if (typeof unDecVariable != 'undefined' && unDecVariable != null) // Alternative way
{
    // do something
}
Автор: SridharKritha Размещён: 05.06.2018 04:30

0 плюса

124 Репутация автора

Неразрешенные ссылки (то есть необъявленные переменные) на самом деле не являются переменными, они добавляются как свойство к глобальному объекту. [5c]

В строгом режиме («используйте строгий») неразрешенные ссылки создают ошибку ReferenceError. Это сделано для того, чтобы избежать добавления в глобальный объект свойств, которые должны были быть объявлены переменными. В этом случае, если вы хотите добавить свойство к глобальному объекту, вы должны использовать window.foo = "bar". [5а]

Автор: bee Размещён: 04.08.2018 10:11
Вопросы из категории :
32x32