Tout en créant JavaScript avec ASP.NET MVC, j'ai remarqué plusieurs avertissements de portée et j'ai réalisé que je manque quelque chose avec la compréhension de la portée variable à l'intérieur de l'instruction Switch / Case.
AVERTISSEMENT: 'I' est déjà défini Se référant à la case B et Case C P> Mon code ressemble à ce code: p> switch(element) {
case 'a':
for(var i=0; i < count; i++){
do something
}
break;
case 'b':
for(var i=0; i < count; i++){
do something
}
break;
case 'c':
for(var i=0; i < count; i++){
do something
}
break;
}
3 Réponses :
JavaScript n'utilise pas la portée du bloc.
Par conséquent, toutes les variables locales sont dans la portée de toute la fonction dans laquelle ils ont été déclarés. P>
Cependant, dans votre cas particulier, il n'y a pas de c- Comme la langue (que je sache) dans laquelle chaque case case code> forme une portée indépendante.
Par exemple, le code C # suivant ne compilera pas: P> switch(someVar) {
case 1:
int a;
break;
case 2:
int a; //'a' is already defined
break;
}
Oui. Je dois m'endormir sur celui-ci parce qu'à première vue, il semblait juste. Mais la joie pour les avertissements du compilateur pour me faire savoir quand je suis tombé endormi. Merci d'une telle bonne réponse.
Notez que dans les langages de type C (non JavaScript), vous pouvez créer une portée vous-même après le cas si vous souhaitez: Case 1: {...} code>
FYI, de nos jours, la syntaxe ES6 permet un blocage de bloc, il serait donc possible de créer une portée après la caisse
Notez que même si le blocage de blocage existe maintenant dans JS, case code> ne crée toujours pas sa propre portée par défaut. À l'aide du mot-clé code> code> dans un cas différent code> code> S, par exemple, lancerait une erreur.
Même si JavaScript avait une portée bloquée, il existe une fonctionnalité d'automne qui disqualifie un peu la notion d'une portée par case code> ... p>
est la portée de l'ensemble du commutateur / de l'affaire? P> blockQuote>
Non, c'est pour la fonction contenant entière ou la portée globale si vous êtes en dehors d'une fonction. P>
(il y a un obscuring peu de cas dans lesquels JavaScript introduit une portée supplémentaire, mais c'est à peu près tout.) P>
AVERTISSEMENT: 'I' est déjà défini P> blockQuote>
Je ne suis pas vraiment d'accord avec cela étant un avertissement. Je préférerais laisser le code tel qu'il est, avec les utilisations indépendantes des blocs de la variable
i code>. P>
Qu'est-ce qu'il veut que vous faire est de retirer le
var code> de tous, mais la première déclaration, ou peut-être ajouter
var i code> avant que le commutateur et supprimer
var Code> à partir de tout le
pour code> s. Mais maintenant, ces blocs ne sont pas seuls seuls et une coupe rapide (pour, disent, refactorise le commutateur code> dans la fonction
distincte code> s) vous laisse avec des boucles Référencer un
i code> qui n'a pas été déclaré
var code>. Il s'agit d'une mondiale accidentelle et c'est un piège JS horrible qui peut être une vraie douleur à déboguer. P>
Jslint fait la même plainte. Je l'ignorerais généralement. Il ne fait aucun mal à déclarer une variable
var code> deux fois dans un bloc. P>
Oui je sais que ça marche. Je n'aime tout simplement pas avoir des avertissements dans le code de production. Mais une conversation ici au bureau à ce sujet a révélé que JQuery fait la même chose. Donc, je peux le laisser. Merci pour la bonne réponse.