私はこのコードを持っています:
if ( something is true ) {
var someVar = true;
} else {
var someVar = false;
}
JsHintは、elseステートメント部分で「someVarはすでに定義されている」と言っています。これはなぜですか、どうすれば修正できますか?
ありがとう
JS変数にはブロックスコープがなく、「関数」スコープ(またはグローバル)があります。
宣言(割り当てではなく)は、関数の先頭に「引き上げられます」。
jshintは、このような宣言が2つあることを警告しています。コードは次のコードと同等です。
var someVar;
var someVar; // warning!
if (something) {
someVar = true;
} else {
someVar = false;
}
これは巻き上げによるものです。
Javascriptでは、var
を使用して新しい変数を定義する場所に関係なく、現在の関数の先頭に移動します。コードは、関数の先頭のifブロックの上に次のものを生成します。
var someVar;
var someVar;
巻き上げを説明するチュートリアルは次のとおりです。
http://net.tutsplus.com/tutorials/javascript-ajax/quick-tip-javascript-hoisting-explained/
そのような場所にvar
宣言を置かないでください。 var
宣言をif
の前に置き、「someVar」に値を設定します。
実際、ここではif
ステートメントはまったく必要ありません。
var someVar = !!(something);
同じことをします。 (!
を二重に適用すると、true
の "真偽"に基づいて、 "someVar"がfalse
またはsomething
に設定されます。)