11
votes

Quelle est la portée de la variable JavaScript dans une déclaration de commutation / cas?

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


0 commentaires

3 Réponses :


16
votes

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


4 commentaires

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: {...}


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 ne crée toujours pas sa propre portée par défaut. À l'aide du mot-clé dans un cas différent S, par exemple, lancerait une erreur.



0
votes

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


0 commentaires

4
votes

est la portée de l'ensemble du commutateur / de l'affaire?

Non, c'est pour la fonction contenant entière ou la portée globale si vous êtes en dehors d'une fonction.

(il y a un obscuring peu de cas dans lesquels JavaScript introduit une portée supplémentaire, mais c'est à peu près tout.)

AVERTISSEMENT: 'I' est déjà défini

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 .

Qu'est-ce qu'il veut que vous faire est de retirer le var de tous, mais la première déclaration, ou peut-être ajouter var i avant que le commutateur et supprimer var à partir de tout le pour s. Mais maintenant, ces blocs ne sont pas seuls seuls et une coupe rapide (pour, disent, refactorise le commutateur dans la fonction distincte s) vous laisse avec des boucles Référencer un i qui n'a pas été déclaré var . Il s'agit d'une mondiale accidentelle et c'est un piège JS horrible qui peut être une vraie douleur à déboguer.

Jslint fait la même plainte. Je l'ignorerais généralement. Il ne fait aucun mal à déclarer une variable var deux fois dans un bloc.


1 commentaires

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.