js变量提升_一道JS变量提升题

d68ed464eb678bf655a8f7d1d1dc2fa7.png
    var a = 0;
    if(true){
        a = 1;
        function a(){};
        a = 21;
        console.log(a);
    }
    console.log(a);
    // 21 1 

当前上下文代码执行之前,会将带var/function的进行声明/定义。

当遇到“{}”时,新版浏览器和老版浏览器的处理不一致。

老版浏览器(IE10以下)忽略“{}”的影响,继续声明/定义,不存在块级作用域

新版浏览器中“{}”里的function只声明不定义,“{}”若出现funciton/let/const关键字,会创建一个块级上下文


本题在全局变量提升阶段会声明一个变量a,在块级作用域内的function a同样会声明,但是不定义。 代码继续执行

    var a = 0;

在全局下给a赋值0。

    if(true){
        a = 1;
        function a(){};
        a = 21;
        console.log(a);
    }

代码执行到条件判断时,创建一个块级作用域,在块级作用域内进行变量提升,声明并且定义funciton a

        a = 1;

块级作用域内给a赋值为1。

继续执行到函数定义的地方为了兼容ES3和ES6浏览器会做这样一步操作:

把代码之前所有对a的操作映射到全局

于时之前对块级作用域内变量a赋值为1的操作也会映射到全局的变量a,所以全局的a变成了1。所以最后控制台打印的是结果是21,和1,因为全局的a映射了。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值