@H_403_0@在JavaScript中,全局变量有两种声明方式
@H_403_0@两者的区别在于是否能通过 delete 操作符删除 @H_403_0@先看一段代码全局变量
b = 'b'; // 隐式声明的全局变量
@H_403_0@在 js 中全局变量其实是global对象(window)的属性,因此两种方式声明的全局变量都可以通过 window 拿到
@H_403_0@console.log(a); // a
console.log(b); // b
console.log(window.a); // a
console.log(window.b); // b
尝试用 delete 删除
全局变量不能被删除
delete a; // 返回 false
@H_403_0@delete 操作符可以删除一个对象的属性,但如果属性是一个不可配置(non-configurable)属性,删除时则会返回 false(严格模式下会抛出异常)
@H_403_0@这就表示使用 var 声明的变量是不可配置的,使用 getOwnPropertyDescriptor 来获取描述属性特性的对象来验证这一点
// 隐式声明的全局变量可以被删除
delete b; // 返回 true
// 删除情况
console.log(typeof a); // string
console.log(typeof b); // undefined
全局变量
var global_var = 1;
global_novar = 2; // 反面教材
(function () {
global_fromfunc = 3; // 反面教材
}());
@H_403_0@在浏览器中,全局对象可以通过window属性在代码的任何位置访问(除非你做了些比较出格的事情,像是声明了一个名为window的局部变量)。但是在其他环境下,这个方便的属性可能被叫做其他什么东西(甚至在程序中不可用)。如果你需要在没有硬编码的window标识符下访问全局对象,你可以在任何层级的函数作用域中做如下操作:
// 试图删除
delete global_var; // false
delete global_novar; // true
delete global_fromfunc; // true
// 测试该删除
typeof global_var; // "number"
typeof global_novar; // "undefined"
typeof global_fromfunc; // "undefined"