在《javascript模式》中学到的,关于javascript全局变量的知识。
javascript总是在不知不觉中就出人意料地创建了全局变量,其原因在于javascript的两个特性。第一特性是javascript可直接使用变量,甚至无需声明。第二特性 是javascript有个暗示全局变量的概念,即任何变量,如果未经声明,就为全局对象所有(也就像正确声明过的全局变量一样可以访问)。
example 1:
function sum(x,y){
result = x+y;
return result;
}
以上代码可以正常使用,result未经声明就使用了,是一个全局变量。
另一种创建隐世全局变量的反模式是带有var声明的链式赋值。
example 2:
function foo(){
var a=b=0;
//...
}
foo();
console.log(b);//line 1
console.log(a);//line 2
代码运行结果是line 1输出 0 ,line 2 报异常:a is not defined.
也许大家想知道这一切是怎么发生的。这源于在同等级别的操作符中优先级是从右到左。首先,优先级较高的是表达式 b=0 ,此时b未经声明就使用为全局变量,同时表达式 b=0 返回0,它被赋值给var声明的局部变量a。
所以在line 1 会正常输出全局变量b的值,line 2 会报错。
如果对链式赋值的所有变量都进行了声明,就不会出现意外的全局变量。例如:
function foo(){
var a,b;
a=b=0;
//...
}
foo();
//console.log(b);//line 1 throw error
//console.log(a);//line 2 throw error