关于js中 var 的变量提升问题

变量提升

    var a="show";
    function hah(){
        alert(a);//undefined
        var a=4;
        alert(a);//4
    }
    hah();

这个我可以理解

function hah(number){
        var a="show";
        while(number!=0){
            alert(a);//show
            var a=4;
            alert(a);//4
            number--;
        }
    }
   hah(1);   

为什么这里的a 弹出的是show

阅读 4k
6 个回答

通俗的给你解释一下!!

js执行顺序一般认为从上而下 但是函数声明权重高 提升 var声明提升 可以理解为
函数 > var >自上到下
(并不是完整的就是这样 只是通俗给你解释上面这套题写的表达式, 但是这个成立)

然后捋一下  先函数声明  声明hah  然后var 声明 此时为未定义   然后hah(1)调用函数,调用
的时候进行一系列 赋值 操作 自上从下撸代码就可以了   至于参数这个number以及下面的判断
都是迷惑你的, 别被迷惑,去掉也是show  4这样的结果

因为在ES6之前,JavaScript没有块级作用域,只有全局作用域和函数作用域。
变量提升的本质是将变量声明提升到它所在作用域的最开始的部分。
浏览器环境 window 是全局作用域,函数 function 包裹的是函数作用域。
while 不是函数,它没有作用域。所以,在条件为 true 的时候相当于:

function hah(number){
        var a="show";
        alert(a);//show
        var a=4;
        alert(a);//4
        number--;
    }
 hah(1);  
   

再进一步分解,就是:

function hah(number){
    var a;
    var a;
    a = "show";
    alert(a);//show
    a=4;
    alert(a);//4
    number--;
}
hah(1);  

var a="show"; 在方法里面啊

等价于

function hah(number){
        var a="show";
        var a;
        while(number!=0){
            alert(a);//show
            a=4;
            alert(a);//4
            number--;
        }
}
hah(1); 

变量提升是楼主造出来的词?

这么理解,首先js代码执行分为两个阶段:编译阶段和执行阶段。函数声明或者变量声明的“提升”属于编译阶段。而 if 、while 等语句属于执行阶段才会去处理的东西。因为var是没有块级作用域的,不管if或while条件是真是假,倘若里面有变量声明或者函数声明,都会在编译阶段拿到当前执行环境作用范围的顶部来。

上述代码其实就是:

// 里面还有涉及到声明重复变量的问题,第二个 var a = 4 会被js引擎忽略var声明,相当于 a = 4
function hah(number){
    var a;
    a = 'show';
    while(number != 0) {
      alert(a); // show
      a = 4;
      alert(a); // 4
      number--;
    }
}
hah(1); 
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题