Глобальный объект служит лексической средой верхнего уровня (верхняя часть цепочки областей, если хотите). Это означает, что глобальные свойства могут быть доступны через прямые ссылки (например, переменные):
// global code
this.foo = 1; // creating a global property
foo // accessing the global property via a direct reference
Это также означает, что глобальные переменные могут быть доступны через ссылки на свойства:
// global code
var foo = 1; // creating a global variable
this.foo // accessing the global variable via a property reference
ИНТЕРПРЕТАЦИЯ 1
Теперь, основываясь на приведенной выше информации, казалось бы, было бы целесообразно использовать термины "глобальная переменная" как "глобальное свойство" взаимозаменяемо, что означает, что оба термина представляют собой то же самое множество глобальных привязок.
Однако существуют две отличия между глобальной переменной, созданной с помощью var
, например. var foo = 1;
и глобальное свойство, созданное посредством назначения, например. this.foo = 1;
:
-
Глобальные переменные статически ограничены, тогда как глобальные свойства динамически добавляются в глобальную среду:
foo // => undefined bar // throws ReferenceError var foo = 1; this.bar = 1;
Итак, глобальные переменные связаны перед оценкой программы, тогда как глобальные свойства привязаны во время оценки программы, когда вычисление присваивается.
-
Глобальные переменные не настраиваются, т.е. они не могут быть удалены (более конкретно, их соответствующие привязки не могут быть удалены из среды впоследствии), тогда как глобальные свойства, созданные посредством назначения, настраиваются.
// the names "foo" and "bar" are bound to the global environment var foo = 1; this.bar = 1; // the binding "bar" can be removed from the global environment subsequently delete this.bar; // the binding "foo" cannot be removed subsequently
При этом следует отметить, что можно создавать неконфигурируемые глобальные свойства:
Object.defineProperty( this, 'bar', { value: 1 }); // non-configurable by default
ИНТЕРПРЕТАЦИЯ 2
Теперь, основываясь на этой новой информации, можно сказать, что глобальные привязки с глобальным глобальным значением могут быть названы глобальными связями только глобально, а динамически добавленные глобальные привязки - это просто глобальные свойства, но не глобальные переменные, что означает, что термин "глобальная переменная" представляет подмножество множества, представленного термином "глобальное свойство" , как в:
Все глобальные переменные являются глобальными свойствами
Только глобальные свойства с глобальным глобальным переменным
Итак, какая интерпретация верна? Оба термина представляют один и тот же набор привязок или один подмножество другого?
ВОПРОС
Я понимаю термин "глобальное свойство" - глобальное свойство является свойством глобального объекта. Однако термин "глобальная переменная" выглядит неоднозначным. Некоторые используют его как синоним "глобального свойства", а другие определяют его как глобальное свойство, которое было определено с помощью инструкции var
. Цель моего вопроса - определить, какое из этих двух значений верно.