Ответ 1
Объявленные и необъявленные глобальные переменные
Механизм хранения и доступа к ним один и тот же, но JavaScript рассматривает их по-разному в некоторых случаях на основе значения атрибута configurable
(описанного ниже). При регулярном использовании они должны вести себя одинаково.
Оба существуют в глобальном объекте
Ниже приведены некоторые сопоставления объявленных и необъявленных глобальных переменных.
var declared = 1; // Explicit global variable (new variable)
undeclared = 1; // Implicit global variable (property of default global object)
window.hasOwnProperty('declared') // true
window.hasOwnProperty('undeclared') // true
window.propertyIsEnumerable('declared') // true
window.propertyIsEnumerable('undeclared') // true
window.declared // 1
window.undeclared // 1
window.declared = 2;
window.undeclared = 2;
declared // 2
undeclared // 2
delete declared // false
delete undeclared // true
delete undeclared // true (same result if delete it again)
delete window.declared // false
delete window.undeclared // true (same result if delete it yet again)
delete window.undeclared // true (still true)
Обе объявленные и необъявленные глобальные переменные являются свойствами объекта window
(глобальный объект по умолчанию). Ни один из них не наследуется от другого объекта через цепочку прототипов. Они оба существуют непосредственно в объекте window
(поскольку window.hasOwnProperty
возвращает true
для обоих).
Конфигурируемый атрибут
Для объявленных глобальных переменных атрибут configurable
false
. Для необъявленных глобальных переменных это true
. Значение атрибута configurable
может быть восстановлено с помощью метода getOwnPropertyDescriptor
, как показано ниже.
var declared = 1;
undeclared = 1;
(Object.getOwnPropertyDescriptor(window, 'declared')).configurable // false
(Object.getOwnPropertyDescriptor(window, 'undeclared')).configurable // true
Если атрибут configurable
свойства имеет значение true, атрибуты свойства могут быть изменены с помощью метода defineProperty
и свойство можно удалить с помощью оператора delete
. В противном случае атрибуты не могут быть изменены, и свойство не может быть удалено таким образом.
В нестрогий режим оператор delete
возвращает true
, если свойство настраивается и возвращает false
, если оно не настраивается.
Резюме
Объявленная глобальная переменная
- Является свойством глобального объекта по умолчанию (
window
) - Атрибуты свойств не могут быть изменены.
- Невозможно удалить с помощью оператора
delete
Необъявленная глобальная переменная
- Является свойством глобального объекта по умолчанию (
window
) - Атрибуты свойств могут быть изменены.
- Можно удалить с помощью оператора
delete