爲什麼foo()函數記錄undefined
? 第一個text
變量是一個全局變量,所以foo()
應該有權訪問它。JavaScript提升和範圍
var text = "outside";
function foo() {
console.log(text);
var text = "inside";
}
foo();
爲什麼foo()函數記錄undefined
? 第一個text
變量是一個全局變量,所以foo()
應該有權訪問它。JavaScript提升和範圍
var text = "outside";
function foo() {
console.log(text);
var text = "inside";
}
foo();
即使var
語句是console.log()
後聲明,聲明被提升到函數的開始。所以這個聲明瞭一個局部變量來影響全局變量。但是直到你真的到達聲明後,初始化纔會發生,聲明在console.log()
聲明之後。
所以你的功能等同於:
function foo() {
var text;
console.log(text);
text = 'inside';
}
如果你沒有使用var
聲明,那麼你會繼續使用全局變量,並重新分配將不會發生,直到console.log()
後。
我認爲值得一提的是,javascript實際上並沒有提起。這種行爲實際上是第一次編譯過程的結果。由此產生的行爲與吊裝相同,然而,從技術上講,沒有任何事情會被吊起來。 – mhodges
@Barmar請務必注意,從foo()函數中移除var會使foo使用文本全局變量 – Feathercrown
@mhodges該函數與提升之間的有效區別是什麼? – Barmar
是否返回文本;和警報(foo()) –
@Jonasw不要在調試語句中使用'alert'。 –