6

JavaScript ホイストについて読んだことがあります。

JavaScript スコーピングと巻き上げ by Ben Cherry
Dmitry Soshnikov による「巻き上げ」についての 2 つの言葉

そして、JavaScript の型強制、true と false のテストについての詳細: Truth, Equality and JavaScriptおよびその他のリソース

そして、いくつか練習していると、巻き上げと変数「真偽」に関する重要な概念が欠けていることがわかりました。

1: 変数宣言が重複している 'if' 真偽テスト

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宣言のみに影響し、実行には影響しません)。しかし、なぜそのアラートが表示されるのですか。これは、私が直接使用する場合にはfalse当てはまりません (以下の非トリック コード: スニペット #3 に示されています)。

2: 変数宣言が重複しない 'if' 真偽判定

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

} 
bar();

o/p:出力なし。コントロールが入っていないことを意味します 'if' ブロック
これは期待できることです

3: 重複した変数宣言で「false」を使用する「if」

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

o/p:出力なし。コントロールが入っていないことを意味します 'if' ブロック
これは期待できることです

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

4

2 に答える 2

9

var例番号 1 では、関数内で使用していて、var宣言が関数の先頭に持ち上げられているため、アラートが表示されます。したがって、次のようになります。


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

} 
bar();

この種の問題は、関数の先頭ですべての変数を明示的に宣言する説得力のある理由を提供すると結論付けるかもしれません。

于 2011-07-20T17:43:28.240 に答える
1

変数宣言だけが積極的に評価されます。最初のケース (ブロック内) での変数の割り当ては、ifブロックに入ったときにのみ発生しifます。

を宣言するだけで、値を代入しない変数の値はundefined(強制的にfalse) になります。

于 2011-07-20T17:42:49.333 に答える