2016-08-14 6 views
2

達成したいこと:何かがうまくいかなかった場合(if (false))、オブジェクトAを再定義してください。次に、新しい変数aを作成してAに割り当てます。if(false)文が読み込まれたのはなぜですか?

class A { 
 

 
} 
 
class B { 
 
    
 
} 
 
class C { 
 
    constructor() { 
 
    if (false) { 
 
     console.log('hit'); // never hit to 
 
     var A = B 
 
    } 
 
    var a = A; 
 
    console.log(a) // undefined 
 
    } 
 
} 
 
var c = new C();

私はラインvar A = Bが実行されたか分からないが、私はifステートメントを削除した場合、console.log(a)は印刷されます:

class A { 

} 

私の質問:なぜ私は取得していますundefined行内console.log(a)

+2

実行時ではなく、解析時にvarsが吊り上げられます – dandavis

+0

ES2015を使用しているときに、 'let' /' const'に切り替えると、もはや 'var'を使用する本当の理由はありません。 – zerkms

+0

異なる結果が期待された理由を説明できますか? –

答えて

6

すべてvar関数内のステートメントは、どこに表示されているかにかかわらず、関数の先頭に表示されているかのように扱われます。それが書かれたかのようにこのように、あなたの関数が正確に解釈されます:変数aAどこかvar宣言でコンストラクタ関数で表示されるので、

したがって
class C { 
    constructor() { 
    var a, A; 
    if (false) { 
     console.log('hit'); // never hit to 
     A = B 
    } 
    a = A; 
    console.log(a) // undefined 
    } 
} 

、それらは全体の機能を通じて宣言されています。宣言された変数のの初期化は、var宣言が実際に出現するところで評価されます。

+1

多くの感謝!それは助けです:) –

+1

これは "巻上げ"として知られているあなたの答えに含めることがあります – Cyoce

+0

@Cyoceはい、それは "ホイスト"の形式であり、 "var"の動作は一般にその用語によって参照されます。 – Pointy

関連する問題