web-dev-qa-db-fra.com

Définition de variables JavaScript dans les instructions if

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;
}
41
lukeshek

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

55
jAndy

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.

2
user1466700

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.

2
farhadf

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.

1
hcarver

É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.)

1
Neil