web-dev-qa-db-fra.com

Pourquoi Jshint dit "variable déjà définie" dans cette instruction if?

J'ai ce code:

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

JsHint dit que "someVar a déjà été défini" sur la partie instruction else. Pourquoi est-ce et comment le résoudre?

Merci

55
user2413333

Les variables JS n'ont pas de portée de bloc, elles ont une portée de "fonction" (ou parfois globale).

La déclaration (mais pas l'affectation) est "hissée" en haut de la fonction.

jshint vous avertit que vous avez deux déclarations de ce type - votre code est équivalent à:

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

Cela est dû au levage.

En javascript, peu importe où vous définissez une nouvelle variable avec var, il la déplace vers le haut de la fonction dans laquelle vous vous trouvez. Votre code produit ce qui suit au-dessus de votre bloc if en haut de la fonction:

var someVar;
var someVar;

Voici un tutoriel pour expliquer le levage:

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

20
Erik Christianson

Vous ne devez pas placer de déclarations var à ces endroits. Placez la déclaration var avant le if, puis définissez simplement "someVar" sur une valeur.

En effet, ici, vous n'avez absolument pas besoin d'une instruction if:

var someVar = !!(something);

fera la même chose. (La double application de ! garantit que "someVar" est défini sur true ou false, en fonction de la "véracité" de something.)

10
Pointy