2016-07-24 3 views
0

この例では、undefinedを印刷する予定です。Javascript:Function hoisting

var bar = typeof foo; 
var foo = function() { 
    console.log('abcd'); 
} 
foo(); 
console.log(bar); // -> undefined 

は、だから私は、変数が掲揚された場合、barfooの上に残っていることを理解し、しかしfooが実行されますので、インタプリタはfooが何であるかを知っているべきではないのですか?

注:インタープリタの仕組みを理解しようとしています。私の質問は、上記のスニペットを修正する方法ではありません。

+3

'bar'に' typeof foo'の値が割り当てられているときに 'foo'が実行されませんでした。巻上げ中、 'foo'の値は未定義です。 –

+0

通常、ホイストが存在することを忘れるのが最善です。あなたの関数が読みやすさになっているかどうかを知り、最後に宣言したいのは本当に便利ですが、名前付き関数式を使って関数を宣言する必要があります。 – 4castle

答えて

5

あなたは変数定義の巻上げを占めている場合は、あなたのコードは、これと同等です:自分自身が掲揚されている

var bar; 
var foo; 

// foo does not yet have a value, so it it's still undefined 
bar = typeof foo; 

// foo gets a value here 
foo = function() { 
    console.log('abcd'); 
} 

// since foo got a value in the previous statement, you can now execute it here 
foo(); 
console.log(bar); 

のみ変数の定義ではなく、割り当て。

だから、あなたは、あなたは、このようにあなたがbarundefinedを割り当てるので、まだ値を持っていないbar = typeof foofooことを実行したときにことを、この順序から見ることができます。など


関数定義:

function foo() { 
    console.log('abcd'); 
} 

も掲揚されているので、あなたがこのようなfooを定義した場合、それは別の話だろう。しかし、あなたが使用している機能の割り当ては、それ自体が吊り上げられていません。 fooを定義する方法は、他の変数のように変数を代入するだけです。

+0

しかし、あなたが述べているように、fooは2番目の変数代入で値を取得します。最後の行で 'bar'が呼び出されるまでにインタープリタはfooが何であるか知っていませんか? – AlanH

+1

@AlanH - 'bar'は、割り当て時に' foo'が持っていたもののコピーを含んでいます。 'foo'をあなたの心の内容に変更することができ、' bar'は変更されません。それは 'var y = 1;のようなものです。 var x = y; y = 2; '' x'の値は 'y'に代入されただけで変化しませんでした。 'x'はもともと' y'にあったもののコピーを持っています。 – jfriend00

+0

@AlanH - 当日のこの回答をご覧ください:http://stackoverflow.com/questions/38538330/when-command-line-order-matters/38538444#38538444 – jfriend00