2016-10-15 3 views
0

私の知る限りを掲揚変数を評価していない場合は、なぜ、変数の宣言は、次のコードでは、彼らはしかし、定義されている文脈で掲揚され、taken from hereJavascriptを:ステートメントが関数に

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

if(!foo)trueと評価されたがどうして?私はそのためif(!foo)つまりif(false)に、if(!true)にさらに解決さを解決する必要があり、既にif(!foo)var foo = 10がfooのコンテキストで評価され、この文から存在var foo意味ブロックが実行けどif (!foo) が真と評価すべきではない場合、したがって、ブロックが実行された場合内のコードと警告10

なぜ誰かが、なぜ重要なのか、どのようにif条件が評価されるか教えてください。

+3

私は混乱しています – Mahi

+1

リンク先の記事をすばやくスキップすると、そこに説明されています.. – ambs

答えて

3

ようこそJavascript "Hoisting"に、それが行うには迷惑な能力だがされているように見えないことを考えています実行中:

Javascriptにはif節のブロックスコープがなく、それが奇妙な方法で補償されています。すべての変数は、使用前に宣言されているように、実行される前に

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

:あなたはそれが実際に翻訳され

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

を行うとき、私は、意味します。それに基づいて、fooは、undefinedではなく、関数外で宣言されます。したがって、if (!foo)と呼ぶと、!undefinedと評価されます。これは常にtrueです。

+0

変数と関数宣言の両方がES5の指定されたスコープの上部に持ち込まれています。そのため、私はCrockfordの推奨する_writing_すべての関数とvar宣言をスコープの先頭に置くことを好みます。その結果、何が起きているのと同じように書かれています。これは規則ではなく、規約ですが、コードの読み取りを簡略化しています。 –

+0

@anied正確に!Crockfordさんのお勧めを引用してくれたことを誇りに思います:) –

0

これはあなたに1を与えます;

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

変数fooはないアウト機能で宣言されたので;) 、これはあまりにもあなたに1を与える:

var foo = 1; 
function bar(x) { 
    if (!x) { 
     var x = 10; 
    } 
    alert(foo); 
} 
bar(foo); 
0

foo関数がコンパイルされるとき、foo変数の別の宣言があります。関数内で変数を持ち上げるため、変数fooにはコードが実行されるまでundefinedの値が割り当てられます。

ザ・変数は、その時点でundefinedあるようfooが時間内にそれがfalseyで、falseyであれば文がチェックされている場合ので、値10がfooに割り当てられているif文に入ります。

内部関数内のfooを変更しても、スコープのためにグローバル変数に影響しません。

関連する問題