2010-03-26 3 views
10

Lors de la création de JavaScript avec ASP.NET MVC, j'ai remarqué plusieurs avertissements d'étendue et j'ai réalisé qu'il me manquait quelque chose avec la compréhension de la portée variable dans l'instruction switch/case.Quelle est la portée de la variable JavaScript dans une instruction switch/case?

Attention: 'i' est déjà défini référant à la jurisprudence b et C

Mon code ressemble à ceci:

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

Je pensais que la portée est terminée par chaque instruction break mais il semble cette portée ne se termine pas jusqu'à la fin de l'interrupteur/boîtier. Est-ce que la portée pour l'ensemble du commutateur/boîtier?

Répondre

15

Javascript n'utilise pas d'étendue de bloc.

Par conséquent, toutes les variables locales sont dans la portée tout au long de la fonction entière dans laquelle elles ont été déclarées.

Cependant, dans votre cas particulier, il n'y a pas de langage de type C (que je connaisse) dans lequel chaque instruction case forme une étendue indépendante.
Par exemple, le code C# suivant ne compilera pas:

switch(someVar) { 
    case 1: 
     int a; 
     break; 
    case 2: 
     int a;  //'a' is already defined 
     break; 
} 
+0

Oui. Je dois m'endormir sur celui-ci parce qu'à première vue, il semblait juste. Mais la joie pour les avertissements du compilateur de me faire savoir quand je me suis endormi. Merci pour cette excellente réponse. –

+3

Notez que dans les langages C-like (pas Javascript), vous pouvez créer une portée vous-même après le cas si vous souhaitez: 'case 1: {...} ' – hugomg

+0

FYI, de nos jours la syntaxe ES6 permet la définition de bloc, donc la création d'une portée après cas serait possible –

0

Même si javascript avait portée de bloc, il y a la fonction de chute à travers laquelle disqualifie un peu l'idée d'avoir une portée par case ...

4

La portée de l'ensemble du commutateur/boîtier est-elle étendue?

Non, c'est pour l'ensemble de la fonction contenant, ou de la portée globale si vous êtes en dehors d'une fonction.

(Il y a des cas quelques obscurs dans lesquels JavaScript introduit la portée supplémentaire, mais c'est à ce sujet.)

Attention: « i » est déjà défini

Je ne suis pas d'accord avec ceci étant un avertissement. Je préférerais laisser le code tel quel, avec les utilisations indépendantes des blocs de la variable i.

Qu'est-ce qu'il veut que vous faire est de retirer la var de tous, mais la première déclaration, ou peut-être ajouter var i avant que le commutateur et retirer var de tous les for s. Mais maintenant ces blocs ne sont pas seuls, et un rapide copier-coller (pour, disons, refactoriser le switch en function) vous laisse avec des boucles référençant un i qui n'a pas été déclaré var. C'est un accident global, 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 n'est pas dangereux de déclarer deux fois une variable var dans un bloc.

+0

Oui, je sais que cela fonctionne. Je n'aime pas avoir d'avertissements dans le code de production. Mais une discussion 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. –

Questions connexes