2015-10-14 70 views
7

在下面爲什麼x在內部範圍內未定義?

var x = 1; 

(function() { 
    console.log(x); 
    var x = 2; 
}()); 

代碼爲什麼說CONSOLE.LOG(X)時,x是未定義的?

+0

@WolfOfWallstreet所以你想在你console.log(x);獲得2號的權利? –

回答

9

變量提升。實際的代碼是這樣執行的。

var x = 1; 
(function() { 
    var x; // x = undefined 
    console.log(x); 
    x = 2; 
})(); 

編輯:關於李斯特先生的建議,有點關於變量提升。來自MDN(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/var):

「變量聲明,無論它們出現在哪裏,都會在任何代碼執行之前被處理。var聲明的變量的作用域是當前的執行上下文,它可能是包含函數或變量在任何職能之外宣佈,全球。「

+2

你可以向OP解釋什麼變量提升是什麼,爲什麼'var x = 1;函數whatever(){console.log(x);}'工作嗎? –

+0

我知道他們可以在其他地方查看它,但如果這裏的答案是獨立的,那麼它會很好。 –

+0

@ TBWill4321這個代碼當我做它。它給未定義! –

3

由於編譯器的原因,即使您在代碼下面啓動了一個var,編譯器也會將它發送到頂端,就像var x;,因此它在運行console.log之前首先啓動爲未定義的「x」,這就是爲什麼這是一種很好的練習,可以啓動你將要在函數中使用的所有變量,所以這些錯誤不會發生。