js中var的重复声明

腾讯的一个笔试题,先看一下

var a = 100;
function fn() {
alert(a); //undefined,因为fn函数不是一个闭包
var a = 200;
alert(a); //200
}
fn();
alert(a); //100
var a;
alert(a); //100
var a = 300;
alert(a); //300

根据《你不知道的JavaScript》上册,提升这章所说,函数提升优先于变量提升,所以上面的代码块等价于

function fn() {
    var a; //var声明表明变量a的作用域为fn函数的词法作用域,fn函数不是一个闭包
    alert(a); //此处为undefined
    a = 200;
    alert(a); //200
}
var a;
a = 100;
fn();
alert(a); //100
var a;
alert(a); //100
var a = 300;
alert(a); //300

后面仨个a为啥呢,这要总结下重复声明的问题:
1.var在同一个作用域下,多次声明多次声明一个变量不仅是合法的,而且也不会造成任何错误.

2.var在同一个作用域下,如果重复使用的一个声明有一个初始值,那么它担当的不过是一个赋值语句的角色.

3.var在同一个作用域下,如果重复使用的一个声明没有一个初始值,那么它不会有任何的影响

4.var a在函数的词法作用域下,哪怕与全局作用域下的变量a同名,也是两个完全无关的变量,当词法作用域内用到a时注意看词法作用域中有无var a声明,当有var声明时,该函数并不是一个闭包。词法作用域的a离开词法作用域会销毁掉这个变量。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值