web-dev-qa-db-ja.com

このifステートメントでJshintが「変数は既に定義されています」と言っているのはなぜですか?

私はこのコードを持っています:

 if ( something is true ) {
        var someVar = true;
    } else {
       var someVar = false;
    }

JsHintは、elseステートメント部分で「someVarはすでに定義されている」と言っています。これはなぜですか、どうすれば修正できますか?

ありがとう

50
user2413333

JS変数にはブロックスコープがなく、「関数」スコープ(またはグローバル)があります。

宣言(割り当てではなく)は、関数の先頭に「引き上げられます」。

jshintは、このような宣言が2つあることを警告しています。コードは次のコードと同等です。

var someVar;
var someVar;  // warning!
if (something) {
     someVar = true;
} else {
     someVar = false;
}
71
Alnitak

これは巻き上げによるものです。

Javascriptでは、varを使用して新しい変数を定義する場所に関係なく、現在の関数の先頭に移動します。コードは、関数の先頭のifブロックの上に次のものを生成します。

var someVar;
var someVar;

巻き上げを説明するチュートリアルは次のとおりです。

http://net.tutsplus.com/tutorials/javascript-ajax/quick-tip-javascript-hoisting-explained/

20

そのような場所にvar宣言を置かないでください。 var宣言をifの前に置き、「someVar」に値を設定します。

実際、ここではifステートメントはまったく必要ありません。

var someVar = !!(something);

同じことをします。 (!を二重に適用すると、trueの "真偽"に基づいて、 "someVar"がfalseまたはsomethingに設定されます。)

10
Pointy