2016-03-27 15 views
1

私はJavaScriptホイストを理解しようとしていましたが、私が理解したところでは、コードの実行前にすべての変数宣言に対してメモリ空間が確保されています。同じ変数の複数の宣言のJavaScriptホイスト

同じ変数の複数の宣言の場合にインタープリタがどのようにしてホイストするかを理解したいと思います。出力は、関数宣言である

console.log(a); 

//first declaration 
function a() { 
    console.log('hello'); 
} 

//second declaration 
var a = 2; 

:次のコードを検討だから

function a() { 
    console.log('hello'); 
} 

、Iは最初の宣言インタプリタ遭遇は、メモリに格納されているものであると仮定しています。ただし、宣言の順序を次のように変更します。

console.log(a); 

//first declaration 
var a = 2; 

//second declaration 
function a() { 
    console.log('hello'); 
} 

結果は同じです。インタプリタは最初の宣言を無視し、2番目の宣言をメモリに格納します。なぜこうなった?後者の場合の出力はundefinedではないでしょうか?

コードは以下のようなインタプリタによって読み取られる

答えて

1

function a() { 
    console.log('hello'); 
} 
var a; 
console.log(a); 
a = 2; 

上記のコードを実行しつつ、aは、最初に関数を参照し、そのvar a;ライン後であろうaが不定であるため、実行されます変数の宣言によって、割り当てられた値はundefinedで設定されません。したがって、その行は無視され、関数参照の値が出力されます。

だろう、あなたのより良い理解のための簡単な例

彼らは未定義にすでに割り当てられた値を設定しようとしている場合
+0

ので、後続の複数の宣言は無視され

function x(){ }; var x; console.log(x); //function x(){ } 
? –

+0

@TarunDugarまあまあです。すでに割り当てられた値は、変数宣言によってundefinedに置き換えられません。 –

+0

よろしくお願いします。ありがとう。 –