js全局变量详解

前言
本文主要介绍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去避免。但是全局变量的使用会影响代码的封装性和可读性,这个我认为才是头疼的了,所以在全局变量命名上语义化得认真些~

Published by

风君子

独自遨游何稽首 揭天掀地慰生平

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注