JavaScript通过函数管理作用域。全局变量则会在下列情况下出现:
在任何地方不使用 var 声明变量,或者直接向未声明的变量赋值。
在函数外部使用 var 声明的变量。
以window. 形式声明的变量。
myglobal='hello';//反模式
console.log(myglobal);//"你好"
console.log(window.myglobal);//"你好"
console.log(window.['myglobal']);//"你好"
全局变量的问题在于,你的JavaScript应用程序和web页面上的所有代码都共享了这些全局变量,他们住在同一个全局命名空间,所以当程序的两个不同部分定义同名但不同作用的全局变量的时候,命名冲突在所难免。比方说,某个第三方脚本定义了一个全局变量,叫做result;接着,在你的函数中也定义一个名为result的全局变量。其结果就是后面的变量覆盖前面的。因此,要想和其他脚本成为好邻居的话,应该尽可能少的使用全局变量,并且始终使用var来声明变量。
一、函数内部不使用 var 声明变量
function sum(x, y) { // 不推荐写法: 隐式全局变量 result = x + y; return result; }
此段代码中的result没有声明。代码照样运作正常,但在调用函数后你最后的结果就多一个全局命名空间,这可以是一个问题的根源。
经验法则是始终使用var声明变量,正如改进版的sum()函数所演示的:
function sum(x, y) { var result = x + y; return result; }
二、使用任务链进行部分 var 声明
// 反例,勿使用 function foo() { var a = b = 0; // ... }
上面的片段中,a是本地变量但是b确实全局变量。
此现象发生的原因在于这个从右到左的赋值,首先,是赋值表达式b = 0,此情况下b是未声明的。这个表达式的返回值是0,然后这个0就分配给了通过var定义的这个局部变量a。换句话说,就好比你输入了:
var a = (b = 0);
如果你已经准备好声明变量,使用链分配是比较好的做法,不会产生任何意料之外的全局变量,如:
function foo() { var a, b; // ... a = b = 0; // 两个均局部变量 }
参考资料:《JavaScript模式》