js变量提升,scope作用域

之所以想起再来温习一遍js的作用域,及js变量解析方式,是因为今天的公司下面的这道题,很显示我挂掉了。好逮也是老前端了 ,不称职。

上代码

//6.    What will be written to the console for the following code snippet?

(function () {

    var a = [1];

    function bar() {
        if (!a) {
            var a = [1, 2];
        }
        console.log(a.join());
    }

    bar();

})()

我直接给了一个1,结果可想而知,看正确的答案

[1,2]

在js中,变量的声明会被解析器悄悄的提升到方法体的最顶部,但是需要注意的是,提升的仅仅是变量的声明,变量的赋值并不会被提升

怎么理解???比如上面的bar函数虽然var a=[1,2]在if判断中并没有运行,但是js在解析时会先将var a=[1,2]在bar的顶部先进行申明也就是提升,看如下面的代码,忘提 了关键的是他不会提升变量的值。也就是说a在此时始终是undefinded,也就是仅仅只是申明确没有赋值;

//js实际解析是这样的
function bar() {
    var a;
        if (!a) {
            console.log(a);           //undefinded  测试a的值         
            a = [1, 2];
        }
        console.log(a.join());        //[1,2]
}

是不是有种错觉,函数内部访问不到全局变量了。肯定不是。只是因为javascript解析关系.a被重新覆盖了.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值