La définition des variables JavaScript dans les instructions if est-elle correcte?
if(a==1){
var b = 1;
} else {
var b = 0;
}
Je sais que le code ci-dessus fonctionnera, cependant, WebMatrix met en évidence les variables.
Dois-je définir les variables en dehors de l'instruction if? Ou la première option est-elle correcte? Ou ça n'a pas vraiment d'importance?
var b = '';
if(a==1){
b = 1;
} else {
b = 0;
}
Depuis la version officielle de la spécification ES2017 (2017-07-08), EcmaScript prend en charge la véritable portée de bloc en utilisant maintenant le let
ou const
mots-clés.
Puisque ECMAscript n'a pas portée de bloc mais portée de fonction, c'est une très bonne idée de déclarer n'importe quelle variable en haut de vos contextes de fonction.
Même si vous pouvez faire des déclarations de variables et de fonctions à tout moment dans un contexte de fonction, c'est très déroutant et apporte des maux de tête étranges si vous n'êtes pas pleinement conscient des conséquences.
Exemple de maux de tête:
var foo = 10;
function myfunc() {
if (foo > 0) {
var foo = 0;
alert('foo was greater than 0');
} else {
alert('wut?');
}
}
Devinez quoi, nous obtenons un "wut?" alerte lors de l'appel de myfunc
ici. En effet, un interpréteur ECMAscript hoist toute instruction var
et déclaration de fonction en haut du contexte automatiquement. Fondamentalement, foo
est initialisé à undefined
avant le premier if statement
.
Pour en savoir plus: Portée et levage JavaScript
Mettre une var à l'intérieur d'une instruction if n'est pas contraire aux "règles" du langage, mais cela signifie qu'en raison du var hissage, cette var sera définie indépendamment du fait que la condition de l'instruction if soit satisfaite.
Notez que ECMAscript 6 prend en charge les variables de niveau bloc en utilisant le mot-clé "let" plutôt que "var". Alors que les variables déclarées avec 'var' sont hissées pour être de portée de fonction quel que soit l'endroit où elles sont déclarées, celles définies à l'aide de 'let' sont limitées au bloc englobant.
Voir fonction four
sur Quelle est la portée des variables en JavaScript?
Depuis 2012, il n'y a pas de portée au niveau du bloc dans JavaScript. Donc, votre première version est très bien: les variables sont définies dans la portée en dehors du bloc if
.
Étant donné que les variables JavaScript ont une portée au niveau de la fonction, votre premier exemple consiste à redéclarer efficacement votre variable, ce qui peut expliquer pourquoi elle est mise en évidence.
Sur les anciennes versions de Firefox, son mode JavaScript strict prévenait cette redéclaration, mais l'un de ses développeurs s'est plaint de restreindre son style, l'avertissement a donc été désactivé. (Les versions actuelles de Firefox prennent en charge une syntaxe de déclaration de variable au niveau du bloc.)