Javascript 总是在不知不觉中就出人意料地创建全局变量,其原因在于javascript 的两个特性。
第一个特性是javascript 可直接使用变量,甚至无需声明;
第二个特性是javascript 有个暗示全局变量的概念,即任何变量,如果未经声明,就为全局对象所有。
1 function foo(x,y){
2 var a = b =0;
3 }
上面的 var a = b =0; 就相当于 var a = (b = 0);//从右至左的操作符优先级 。这里的b 就是一个隐式全局变量。
写成 var a, b;
a = b =0;
隐式全局变量 与 明确定义的全局变量有细微的不同,不同之处在于能否使用 delete 操作符撤销变量。
- 使用 var 创建的全局变量(这类变量子啊函数外部创建)不能删除。
- 不使用 var 创建的隐含全局变量(尽管它是在函数内部创建)可以删除。
这表明隐含全局变量严格来讲不是真正的变量,而是全局对象的属性,属性可以通过 delete 操作符删除,但变量不可以。
以下为验证代码:
1 var global_var = 1;
2 global_novar = 2;
3 (function(){
4 global_fromfunc = 3;
5 });
6
7 //企图删除
8 delete global_var;//false
9 delete global_novar;//true
10 delete global_fromfunc;//true
11
12 typeof global_var;//"number"
13 typeof global_novar;//"undefined"
14 typeof global_fromfunc;//"undefined"
单一var 模式:
只使用一个var 在函数顶部进行变量声明是一种非常有用的模式。它的好处在于:
- 提供一个单一的地址以查找到函数需要的的所有局部变量;
- 防止出现变量在定义前就被使用的逻辑错误;
- 帮助牢记要声明变量,以尽可能少地使用全局变量;
- 更少的编码。
单一 var 模式如下所示:
function func(){
var a = 1,
b = 2,
sum = a + b,
myobject = {},
i,
j;
//函数体
}
注意变量之间以逗号间隔
js 中变量声明提升:
先看例子:
1 myname = "Nick";
2
3 function func(){
4 alert(myname);//未定义
5 var myname = "Devil";
6 alert(myname);//"局部变量"
7 }
8
9 func();
第 4 行,乍一看是alert 全局变量 myname ,事实并非如此!javascript 允许在函数的任意地方声明多个变量,无论在哪里声明,效果都等同于子啊函数顶部进行声明。这就是所谓的“提升”。上面代码等同于:
myname = "Nick";
function func(){
var myname;//声明提前
alert(myname);//未定义
myname = "Devil";
alert(myname);//"局部变量"
}
func();