2011-07-20 10 views
5

私はいつかJavaScriptホイストについて読んできました。JavaScriptホイストと真実と偽りを理解する

JavaScript Scoping and Hoisting by Ben Cherry
Two words about “hoisting” by Dmitry Soshnikov

と、JavaScriptの型強制、真実&偽のテストに関するいくつかの詳細: Truth, Equality and JavaScriptといくつかの他のリソース

そして、いくつかを練習しながら、私はいくつかの重要な概念が欠落しているmは見つけ変態と真実について&偽物。

1:重複した変数宣言

var foo = 1; 
function bar() { 
    if (!foo) { 
    alert('inside if'); 
     var foo = 10; 
    } 

} 
bar(); 

O/Pとの真実試験 'が':inside if

ダウト: 'FOO' の値 '1' は、if(!foo)falseに評価すべきであるとそのブロックは実行されるべきではありません(上のリソースから引用:昇降はvar & function宣言のみに影響しますが、実行は影響しません)。しかし、なぜその警告が表示されます。 このIは、直接(無トリック以下のコードで示す:スニペット#3)falseを使用する場合は当てはまらない

2:真実試験重複変数宣言せず

var foo = 1; 
function bar() { 
    if (!foo) { 
     alert('inside if'); 
    } 

} 
bar(); 

O/P「であれば」 :出力なし。制御はブロック「が」入力されていないことを意味
これは1つが期待できるものである

3:重複した変数宣言

var foo = 1; 
function bar() { 
    if (false) { 
     alert('inside if'); 
     var foo = 10; 
    } 
} 
bar(); 

O/pで「もし」を使用した「偽」:出力しません。ブロックが「if」ブロックに入力されていないことを意味します。

誰かが明確にしてください。ありがとう

答えて

8

、アラートが表示されますので、のと同等です。


var foo = 1; 
function bar() { 
    var foo; 
    if (!foo) { 
     alert('inside if'); 
     foo = 10; 
    } 

} 
bar(); 

これらの種類の問題は、すべての変数を関数の先頭に明示的に宣言する必要があると結論づけることができます。

+2

私の悪いです。私はその機能を全く気にしなかった。私はタイプ強制と巻上に集中しているだけです(彼らは私の頭の中で回転しています)。重複した宣言が関数内にない場合、 'foo'は2番目の宣言の後であっても前の値(1)を持ちます。このすべての思考は私に、使用された機能を見逃してしまった。私の目を開けてくれてありがとう:) – manikanta

+0

なぜ3番はうまくいかないのですか?変数が定義されていない場合、それはその偽を意味しますか? – bill

1

変数宣言のみが熱心に評価されます。最初のケース(ブロック内)の変数割当は、ifブロックの入力時にのみ発生します。

あなただけ宣言しますが、任意の値を割り当てるいない変数は、(falseに強制変換)undefinedの値を持ちます。あなたは、関数の先頭に掲揚された関数内varvar宣言を使用しているので、

あなたの例番号1の場合
+0

答えをありがとう。 @patrick dwとあなたはどちらも正しいと答えました(実際には私の無知を無視してくれてありがとう)。しかし、私は1つの答えしか受け入れることができません。パトリック氏が最初に答えたので、私は彼を受け入れました。ところで私はあなたの答えをアップしました。ありがとう。 – manikanta

関連する問題