web-dev-qa-db-ja.com

ifステートメント内のJavaScript変数の定義

Ifステートメント内のJavaScript変数の定義は正しいですか?

if(a==1){
    var b = 1;
} else {
    var b = 0;
}

上記のコードは機能しますが、WebMatrixは変数を強調表示します。

If文の外側で変数を定義する必要がありますか?または、最初のオプションは正しいですか?またはそれは本当に重要ではありませんか?

var b = '';
if(a==1){
    b = 1;
} else {
    b = 0;
}
41
lukeshek

ES2017仕様の公式リリース(2017-07-08)の時点で、EcmaScriptdoesletまたはconstキーワード。


ECMAscriptにはblock scopeではなくfunction scopeがあるため、変数を宣言することをお勧めします関数コンテキスト。

関数コンテキスト内の任意の時点で変数と関数の宣言を(することができますが、結果を完全に認識していない場合は非常に混乱し、奇妙な頭痛の種をもたらします。

頭痛の例:

var foo = 10;

function myfunc() {
    if (foo > 0) {
        var foo = 0;
        alert('foo was greater than 0');
    } else {
        alert('wut?');
    }
}

何だと思う、私たちは「wut?」ここでmyfuncを呼び出したときにアラートを出します。これは、ECMAscriptインタプリタがコンテキストの最上部に自動的にhoistvarステートメントとfunction宣言を追加するためです。 。基本的に、fooは最初のif statementの前にundefinedに初期化されます。

さらに読む: JavaScript Scoping and Hoisting

55
jAndy

Ifステートメント内にvarを配置することは、言語の「ルール」に反しませんが、varホイストにより、ifステートメントの条件が満たされるかどうかに関係なく、そのvarが定義されることを意味します。

2
user1466700

ECMAscript 6は、「var」キーワードではなく「let」を使用したブロックレベル変数をサポートしていることに注意してください。 'var'で宣言された変数は、宣言されている場所に関係なく関数スコープになるようにホイストされますが、 'let'を使用して定義された変数は、囲みブロックのみにスコープされます。

2
farhadf

関数fourを参照してください JavaScriptの変数のスコープは?

2012年現在、JavaScriptにはブロックレベルのスコープはありません。最初のバージョンは問題ありません。変数はifブロックの外側のスコープで定義されます。

1
hcarver

JavaScriptの変数には関数レベルのスコープがあるため、最初の例は変数を効果的に再宣言することです。これにより、変数が強調表示される理由を説明できます。

Firefoxの古いバージョンでは、その厳格なJavaScriptモードがこの再宣言について警告していましたが、開発者の1人が彼のスタイルを狭めたために警告がオフになったことに不満を述べました。 (Firefoxの現在のバージョンは、ブロックレベルの変数宣言構文をサポートしています。)

1
Neil