全局对象充当顶级词法环境(范围链的顶部,如果您愿意的话)。这意味着可以通过直接引用(如变量)访问全局属性:
// 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
但是,使用,eg创建的全局变量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
语句定义的全局属性。我的问题的目的是确定这两种含义中的哪一种是正确的