2016-09-08 90 views
0

爲什麼foo()函數記錄undefined? 第一個text變量是一個全局變量,所以foo()應該有權訪問它。JavaScript提升和範圍

var text = "outside"; 

function foo() { 
    console.log(text); 
    var text = "inside"; 
} 

foo(); 
+0

是否返回文本;和警報(foo()) –

+2

@Jonasw不要在調試語句中使用'alert'。 –

回答

4

即使var語句是console.log()後聲明,聲明被提升到函數的開始。所以這個聲明瞭一個局部變量來影響全局變量。但是直到你真的到達聲明後,初始化纔會發生,聲明在console.log()聲明之後。

所以你的功能等同於:

function foo() { 
    var text; 
    console.log(text); 
    text = 'inside'; 
} 

如果你沒有使用var聲明,那麼你會繼續使用全局變量,並重新分配將不會發生,直到console.log()後。

+0

我認爲值得一提的是,javascript實際上並沒有提起。這種行爲實際上是第一次編譯過程的結果。由此產生的行爲與吊裝相同,然而,從技術上講,沒有任何事情會被吊起來。 – mhodges

+0

@Barmar請務必注意,從foo()函數中移除var會使foo使用文本全局變量 – Feathercrown

+1

@mhodges該函數與提升之間的有效區別是什麼? – Barmar