Ifステートメント内のJavaScript変数の定義は正しいですか?
if(a==1){
var b = 1;
} else {
var b = 0;
}
上記のコードは機能しますが、WebMatrixは変数を強調表示します。
If文の外側で変数を定義する必要がありますか?または、最初のオプションは正しいですか?またはそれは本当に重要ではありませんか?
var b = '';
if(a==1){
b = 1;
} else {
b = 0;
}
ES2017仕様の公式リリース(2017-07-08)の時点で、EcmaScriptdoesはlet
または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
に初期化されます。
Ifステートメント内にvarを配置することは、言語の「ルール」に反しませんが、varホイストにより、ifステートメントの条件が満たされるかどうかに関係なく、そのvarが定義されることを意味します。
ECMAscript 6は、「var」キーワードではなく「let」を使用したブロックレベル変数をサポートしていることに注意してください。 'var'で宣言された変数は、宣言されている場所に関係なく関数スコープになるようにホイストされますが、 'let'を使用して定義された変数は、囲みブロックのみにスコープされます。
関数four
を参照してください JavaScriptの変数のスコープは?
2012年現在、JavaScriptにはブロックレベルのスコープはありません。最初のバージョンは問題ありません。変数はif
ブロックの外側のスコープで定義されます。
JavaScriptの変数には関数レベルのスコープがあるため、最初の例は変数を効果的に再宣言することです。これにより、変数が強調表示される理由を説明できます。
Firefoxの古いバージョンでは、その厳格なJavaScriptモードがこの再宣言について警告していましたが、開発者の1人が彼のスタイルを狭めたために警告がオフになったことに不満を述べました。 (Firefoxの現在のバージョンは、ブロックレベルの変数宣言構文をサポートしています。)