В чем разница между глобальным var и window.variable в javascript?
27992 просмотра
6 ответа
Я читаю документы backbone.js и вижу много кода, который присваивает атрибуты объекту окна:
window.something = "whatever";
какая разница между вызовом этого кода и просто назначением переменной и созданием глобальной переменной, например так:
something = "whatever";
Я предполагаю, что есть какая-то другая область видимости, и / или разница в владении объектом (окно является владельцем, а не нет), но меня интересует детали между ними и почему я бы использовал окно, а не его использование.
Автор: Derick Bailey Источник Размещён: 12.11.2019 09:28Ответы (6)
68 плюса
Нет разницы. Они оба имеют одинаковый эффект (в браузере, где 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
.
8 плюса
Они оба делают одно и то же.
Но, получая доступ к 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
5 плюса
Ключ, на который ссылался Райнос, заключается в том, что он явно задан для объекта window. В браузере глобальный объект такой же, как объект окна, но в других средах (например, node.js или, возможно, работает в каком-либо веб-представлении на мобильном устройстве), это может быть не так.
Автор: ScottKoon Размещён: 14.06.2011 08:042 плюса
Разница в том, что window.foo = bar;
не может быть перехвачен рефакторингом, сделанным позже. Использование foo = bar;
означает, что если на более позднем этапе код будет перемещен в замыкание, где var foo
он был определен, он больше не будет устанавливать его в глобальном объекте.
0 плюса
Добавление еще одного пункта:
Если вы ссылаетесь на необъявленную переменную напрямую (без использования - 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 плюса
Неразрешенные ссылки (то есть необъявленные переменные) на самом деле не являются переменными, они добавляются как свойство к глобальному объекту. [5c]
В строгом режиме («используйте строгий») неразрешенные ссылки создают ошибку ReferenceError. Это сделано для того, чтобы избежать добавления в глобальный объект свойств, которые должны были быть объявлены переменными. В этом случае, если вы хотите добавить свойство к глобальному объекту, вы должны использовать window.foo = "bar". [5а]
Автор: bee Размещён: 04.08.2018 10:11Вопросы из категории :
- javascript Как определить, какой из указанных шрифтов был использован на веб-странице?
- javascript Валидация клиентской стороны ASP.Net
- javascript Длина объекта JavaScript
- javascript Получение текста из выпадающего списка
- javascript Скрипт входа со скрытыми кнопками
- javascript Как автоматически изменить размер текстовой области с помощью Prototype?
- attributes Каковы лучшие практики использования атрибутов сборки?
- attributes Атрибут InternalsVisibleTo не работает
- attributes Can you use "where" to require an attribute in c#?
- attributes Как вы программно устанавливаете атрибут?
- attributes Может ли класс C # наследовать атрибуты из своего интерфейса?
- attributes Как перечислить все классы с пользовательским атрибутом класса?
- scope Почему переменные не объявлены в «try» в области «catch» или «finally»?
- scope Как работают закрытия JavaScript?
- scope Область видимости переменной Bash
- scope Краткое описание правил оглавления?
- scope Python variable scope error
- scope Использование глобальных переменных в функции