全局对象充当顶级词法环境(作用域链的顶部,如果您愿意的话)。这意味着可以通过直接引用(如变量)访问全局属性:
// 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
,e.g. var foo = 1;
,以及通过赋值创建的全局属性,例如this.foo = 1;
:
-
全局变量是静态范围,而全局属性是动态添加对全球环境:
foo // => undefined
bar // throws ReferenceError
var foo = 1;
this.bar = 1;
所以,全局变量是绑定的before程序评估,而全局属性受到限制during项目评估,当评估作业时。
-
全局变量是不可配置的,即它们不能被删除(更具体地说,它们相应的绑定随后不能从环境中删除),而通过赋值创建的全局属性are可配置。
// 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
现在,根据这一新信息,人们可以说,只有静态作用域的全局绑定才可以称为全局属性和全局变量,而动态添加的全局绑定仅仅是全局属性,而不是全局变量,这意味着术语“全局”变量”代表a subset由术语“全局属性”表示的集合,如下所示:
所有全局变量都是全局属性
只有静态范围的全局属性才是全局变量
那么,哪种解释是正确的呢?这两个术语是否代表同一组绑定,或者一个是另一个的子集?
问题
我确实理解术语“全局属性” - 全局属性是全局对象的属性。然而,术语“全局变量”似乎是模糊的。有些人将其用作“全局属性”的同义词,而另一些人则将其定义为通过var
陈述。我的问题的目的是确定这两个含义中哪一个是正确的