前言
本文主要介绍3种全局变量的定义方式以及开发中会遇到的一些问题,再加上一点个人见解。
首先简单的介绍一下3种全局变量的定义方式
var a = 1;//方式1
b = 2;//方式2
window.c = 3;//方式3
这3种形式定义出来的全局变量都属于window对象
对于方式1我们都不陌生,方式3也看过不少,方式2的隐似创建方式我们或多或少都干过,例如
var a = 1;
function b(){ a = 2; } alert(a);//1
b();
alert(a);//2
我们可能在一个函数内定义一个变量,漏了var,就会被认为是全局变量的定义,忽略当前的作用域,所以我们平时定义变量时候切记加上“var”关键字,就像比较用“===”一样,不然程序bug了,有你好受。
我们再看看这3种定义方式的优先级别,看程序
var a = 1;
a = 2;
window.a= 3;
alert(a);//3
b = 2;
window.b= 3;
var b = 1;
alert(b)//1
var c = 1;
window.c= 3;
c = 2;
alert(c)//2
上面也提到过这3种方式定义的变量都属于window对象,所以没有优先级别,只有先后顺序。
var理所当然是最推荐的方式,但是var也有“特别之处”,下面我们来看看它的另类
alert(a);//error
a = 1;
alert(a);//error
window.a = 1;
alert(a);//undefined
var a = 1;
是不是有点奇怪,说好的兄弟情义呢,这是因为var修饰的变量会预定义,至于为什么,这是js解析器的做法,暂且不讨论。预定义就是在脚本执行之前就会定义变量,所以这里弹出的结果是undefined,而其他则是error。
我们再来测试测试delete
var a = 1;
b = 2;
window.c= 3;
delete a;
delete b;
delete c;
alert(a);//1
alert(b);//error b is not defined
alert(c);//error c is not defined
这个结果告诉了我们,var修饰的全局变量 是无法被GC回收的,也就是说,var定义的全局变量从被定义开始就一直待在内存中知道程序结束。
顺带也说下function的定义方式,在全局作用作用域下,function对象的用以上3种方式没有区别,也只会存在于当前作用域,不会像普通变量不用var修饰会上升成全局变量这种事
function a()
{
b = 1;
}
function c(){
function a()
{
b = 2;
}
}
alert(a);//function a(){b = 1;}
最后讲讲个人对全局变量的一些认识和见解
优点:全局变量一次定义赋值后可以在整个程序中使用,对于常用的对象定义为全局变量,不管对于资源、效率或者编码上都很不错。
缺点:全局变量定义后就会常驻内存,消耗资源;全局变量在一个作用域,对于开发者来说是个挑战,特别是大型项目;这两个问题完全可以由我们coder去避免。但是全局变量的使用会影响代码的封装性和可读性,这个我认为才是头疼的了,所以在全局变量命名上语义化得认真些~