在javascript函数中覆盖变量

时间:2014-03-12 15:48:20

标签: javascript variables scope

首先,我想说我在javascript中搜索有关范围变量的一些信息(例如What is the scope of variables in JavaScript?),我试图理解为什么我的代码表现得像那样,但最后我真的不知道。我无法在函数中覆盖函数中的var a,我只能使用不带var的a = 6;来执行此操作。为什么在if语句和覆盖此变量之前未定义?为什么没有这样的结果:

  

5

     

等于5
  等于6

我有类似的东西:

  

未定义

     

不等于5
  等于6

这是我的代码:

    var a = 5;

function something(){
    console.log(a);
    if(a == 5){
        console.log('equal 5')
    }
    else{
        console.log('not equal 5');
    }    
   var a = 6;

    function test(){
        if(a == 6){
        console.log('equal 6');
    }
    else{
        console.log('not equal 6')
    }
    }    
    test();    
}
something();

2 个答案:

答案 0 :(得分:5)

这是因为javascript变量提升。

您的代码等于:

var a = 5;

function something(){
    var a;  // here
    console.log(a); // a is the local variable which is undefined
    if(a == 5){
        console.log('equal 5')
    }
    else{
        console.log('not equal 5'); // a is undefined so not equal 5
    }    

    a = 6; // a is assigned to 6

    function test(){
        if(a == 6){
            console.log('equal 6');  // a is 6 here
        }
        else{
            console.log('not equal 6')
        }
    }    
    test();    
}
something();

答案 1 :(得分:1)

因为当您第二次宣布var a = 6的第一次声明,即a时,我宣布var a = 5。因此,当您定义函数something()时,尚未定义a,因此console.log(a)将返回undefined。

但是当您用a替换a = 6的第二个声明时,第一个声明仍然有效,之后您只需更改a的值,这样您就可以得到预期结果:< / p>

5 
equal 5
equal 6 

有关详细讨论,请参阅this post