2016-09-08 3 views
0

なぜfoo()関数はundefinedをログに記録しますか? 最初のtext変数はグローバル変数であるため、foo()にアクセスできる必要があります。 var文が宣言が関数の先頭に掲揚されconsole.log()文の後であってもJavaScriptホイストとスコープ

var text = "outside"; 

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

foo(); 
+0

テキストを返します。警告(foo()) –

+2

@Jonaswはデバッグ文に 'alert'を使用しません。 –

答えて

4

。したがって、グローバル変数をシャドウするローカル変数を宣言します。しかし、初期化は、実際にステートメントに到達するまで発生しません。これは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