已声明和未声明的全局变量
存储和访问它们的机制是相同的,但 JavaScript 在某些情况下会根据configurable
属性(如下所述)。在常规使用中,它们的行为应该相同。
两者都存在于全局对象中
下面是一些比较declared and 未申报的全局变量。
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)
Both declared and 未申报的全局变量是window
对象(默认全局对象)。两者都不是通过原型链从不同的对象继承的。它们都直接存在于window
对象(因为window.hasOwnProperty https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/hasOwnProperty回报true
对彼此而言)。
可配置属性
For declared全局变量,configurable
属性是false
. For 未申报的全局变量,它是true
。的价值configurable
可以使用以下方法检索属性getOwnPropertyDescriptor https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/getOwnPropertyDescriptor方法,如下图。
var declared = 1;
undeclared = 1;
(Object.getOwnPropertyDescriptor(window, 'declared')).configurable // false
(Object.getOwnPropertyDescriptor(window, 'undeclared')).configurable // true
If the configurable
属性的属性为 true 时,可以使用以下命令更改属性的属性defineProperty https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/defineProperty方法,并且可以使用以下方法删除该属性delete https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/delete操作员。否则,无法更改属性,也无法以这种方式删除属性。
In 非严格模式 https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Functions_and_function_scope/Strict_mode, the delete
运算符返回true
如果该属性是可配置的,并返回false
如果它是不可配置的。
Summary
声明的全局变量
- 是默认全局对象的属性(
window
)
- 属性属性cannot被改变。
-
Cannot可以使用删除
delete
操作员
未声明的全局变量
- 是默认全局对象的属性(
window
)
- 属性属性can被改变。
-
Can可以使用删除
delete
操作员
See also
- 删除操作符 https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/delete
- 对象.defineProperty https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/defineProperty
- Object.getOwnPropertyDescriptor https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/getOwnPropertyDescriptor
- 拥有自己的财产 https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/hasOwnProperty
- 严格模式 https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Functions_and_function_scope/Strict_mode