2014-03-12 107 views
1

首先,我想說我正在搜索有關javascript範圍變量的一些信息(例如What is the scope of variables in JavaScript?),我試圖理解爲什麼我的代碼的行爲如此,但最後我真的不知道。我不能在函數中重寫var a,我只能使用a = 6;而不使用var。爲什麼a在if語句之前未定義並覆蓋此變量?爲什麼會出現這樣的沒有結果:覆蓋javascript函數中的變量

等於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(); 

回答

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

因爲當你聲明var a = 6你第二次被覆蓋的a第一個聲明,即var a = 5。所以當你定義函數something()時,a尚未定義,因此console.log(a)返回undefined。

然而,當你剛剛a = 6第一個聲明仍然有效替代的a第二個聲明,你只需要改變的a值之後,所以你得到預期的結果:

5 
equal 5 
equal 6 

this post更多的討論。