浅谈js变量作用域

1,从作用域的角度出发:变量可分为全局变量和局部变量,全局变量顾名思义是在任何地方都可以访问的,而局部变量则不然,列如在一个函数中定义一个变量 :
function af(){
var b = 10;
}
这个变量b在函数外是访问不了的。
全局变量如何定义呢,可以直接在函数外 var c = 10; 或者是不加"var" 直接就是  c = 10,这种称为隐式申明;或者是加上window : window.c = 10;这里就有个地方要注意了:
如果你在一个函数内使用隐式申明或是加上window,这样的方式去定义一个全局变量,如
function bf(){
d = 11;
}
这时你直接在函数外访问 alert(d),是访问不了的,会报没有定义的错误,但是如果你先执行函数bf(),在访问变量alert(d),就可以了。其实这也很容易理解,函数未执行,这个变量就没有被申明,还没有为他分配内存,所以不存在。

2,全局变量和局部变量使用那个比较好:
这个问题其实也是很明显的,函数内的局部变量在函数执行的时候回为其分配内存,当函数执行完之后就会摧毁回收,而全局变量是要在程序执行完才能回收,尽可能的避免使用全局变量,因为它还可能带来其他问题,列如变量覆盖。而局部变量是鼓励使用的(当然不是乱使用),特别是涉及到要操作dom,或是需要多次去计算的情况下,比如在一个数组循环中,要把数组的值输出:
var ary  = [1,2,3,4,5];  
var leng = ary.length;//先把长度计算出,不要每次都去取数组的长度
for(var i=0; i<leng; i++){
.............
}

3,一些坑
 
 先看看这两段代码的区别,第一段会正常输出11,而第二段就会输出undefined,这是为什么呢
其实这就跟变量的解析有关了,变量的解析开始是会在当前作用域内查找变量,如果没有找到,就会到上一层作用域去找,
但是在第二段代码中,是可以找到这个变量a的,所以它直接输出,但是很遗憾的是,这个变量还没有赋值,也就是等于申明了一个变量,但是没有赋值  就像:var a;  alert(a)  这种情况。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值