javascript全局变量

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模式》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值