javascript 显示全局变量与隐式全局变量的区别
在JavaScript中,全局变量有两种声明方式
-
使用var显示声明的全局变量
-
不使用var声明的隐式全局变量
两者的区别在于是否能通过delete操作符删除
先看一段代码
vara='a';//显式声明的全局变量 b='b';//隐式声明的全局变量 console.log(a);//a console.log(b);//b console.log(window.a);//a console.log(window.b);//b
在js中全局变量其实是global对象(window)的属性,因此两种方式声明的全局变量都可以通过window拿到
尝试用delete删除
//显式声明的全局变量不能被删除 deletea;//返回false //隐式声明的全局变量可以被删除 deleteb;//返回true //删除情况 console.log(typeofa);//string console.log(typeofb);//undefined
delete操作符可以删除一个对象的属性,但如果属性是一个不可配置(non-configurable)属性,删除时则会返回false(严格模式下会抛出异常)
这就表示使用var声明的变量是不可配置的,使用getOwnPropertyDescriptor来获取描述属性特性的对象来验证这一点
Object.getOwnPropertyDescriptor(window,a);//{value:"a",writable:true,enumerable:true,configurable:false} Object.getOwnPropertyDescriptor(window,b);//{value:"b",writable:true,enumerable:true,configurable:true}
两者的根本区别在于显式声明的变量不可配置,不能通过delete操作符删除
需要注意的是configurable值一旦为false,描述属性特性的对象就不能被修改,因此不能通过修改属性描述符使得显示声明的全局变量能被delete删除,但反过来,可以使隐式声明的全局变量也不能被delete删除
b='b'; vardescriptor=Object.getOwnPropertyDescriptor(window,b); descriptor.configurable=false; Object.defineProperty(window,b,descriptor); deleteb;//返回false
以下是其他网友的补充
JavaScript之全局变量和隐式全局变量
隐式全局变量和明确定义的全局变量间有些小的差异,就是通过delete操作符让变量未定义的能力。
1、通过var创建的全局变量(任何函数之外的程序中创建)是不能被删除的。
2、无var创建的隐式全局变量(无视是否在函数中创建)是能被删除的。
这表明,在技术上,隐式全局变量并不是真正的全局变量,但它们是全局对象的属性。属性是可以通过delete操作符删除的,而变量是不能的:
//定义三个全局变量 varglobal_var=1; global_novar=2;//反面教材 (function(){ global_fromfunc=3;//反面教材 }()); //试图删除 deleteglobal_var;//false deleteglobal_novar;//true deleteglobal_fromfunc;//true //测试该删除 typeofglobal_var;//"number" typeofglobal_novar;//"undefined" typeofglobal_fromfunc;//"undefined"
在浏览器中,全局对象可以通过window属性在代码的任何位置访问(除非你做了些比较出格的事情,像是声明了一个名为window的局部变量)。但是在其他环境下,这个方便的属性可能被叫做其他什么东西(甚至在程序中不可用)。如果你需要在没有硬编码的window标识符下访问全局对象,你可以在任何层级的函数作用域中做如下操作:
varglobal=(function(){ returnthis; }());
这种方法可以随时获得全局对象,因为其在函数中被当做函数调用了(不是通过new构造),this总是指向全局对象。实际上这个病不适用于ECMAScript5严格模式,所以,在严格模式下时,你必须采取不同的形式。例如,你正在开发一个JavaScript库,你可以将你的代码包裹在一个即时函数中,然后从全局作用域中,传递一个引用指向this作为你即时函数的参数。
以上就是javascript显示全局变量与隐式全局变量的区别,两者的根本区别在于显式声明的变量不可配置,不能通过delete操作符删除,希望大家多关注毛票票的其他文章。