2010-03-26 13 views
10

Durante la creazione di JavaScript con ASP.NET MVC ho notato diversi avvisi di ambito e mi sono reso conto che mi manca qualcosa con la comprensione dell'ambito della variabile all'interno dell'istruzione switch/case.Qual è l'ambito della variabile JavaScript in un'istruzione switch/case?

Attenzione: 'i' è già definito riferendosi al caso B e C

Il mio codice è simile a questo:

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

ho pensato ambito si è conclusa con l'istruzione break ma sembra quell'ambito non termina fino alla fine del passaggio/caso. È l'ambito dell'intero switch/caso?

risposta

15

Javascript non utilizza scope di blocco.

Pertanto, tutte le variabili locali sono incluse nell'ambito dell'intera funzione in cui sono state dichiarate.

Tuttavia, nel vostro caso particolare, non esiste un linguaggio di tipo C (che io sappia) in cui ogni istruzione case costituisce un ambito indipendente.
Ad esempio, il seguente codice C# non compilare:

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

Sì. Devo addormentarmi su questo perché a prima vista sembrava giusto. Ma la gioia per gli avvertimenti del compilatore di farmi sapere quando mi sono addormentato. Grazie per una risposta così grande. –

+3

Si noti che nelle lingue simili a C (non Javascript) è possibile creare un ambito dopo il caso se si desidera: 'caso 1: {...} ' – hugomg

+0

FYI, al giorno d'oggi la sintassi ES6 consente l'esplorazione dei blocchi, quindi sarebbe possibile creare un ambito dopo l'altro –

0

Anche se javascript un margine di manovra di blocco, non v'è la caratteristica caduta-through, che squalifica un pò l'idea di avere un campo di applicazione per case ...

4

È l'ambito dell'intero interruttore/caso?

No, è per l'intera funzione di contenimento o ambito globale se ci si trova al di fuori di una funzione.

(Ci sono oscuri pochi casi in cui JavaScript introduce portata in più, ma questo è tutto.)

Attenzione: 'i' è già definiti

Io in realtà non sono d'accordo con questo essere un avvertimento. Preferirei lasciare il codice così com'è, con gli usi indipendenti dei blocchi della variabile i.

Che cosa vuole che tu faccia è rimuovere il var da tutti, ma la prima dichiarazione, o magari aggiungere var i prima che l'interruttore e rimuovere var da tutte le for s. Ma ora questi blocchi non sono indipendenti e una rapida copia e incolla (per esempio, refactoring dello switch in separati function s) ti lascia con i loop che fanno riferimento a uno i che non è stato dichiarato var. Questo è un globale accidentale, ed è una trappola JS orribile che può essere un vero problema per il debug.

JSLint fa lo stesso reclamo. Normalmente lo ignorerei. Non fa male dichiarare una variabile var due volte in un blocco.

+0

Sì, lo so che funziona. Non mi piace avere avvertenze nel codice di produzione. Ma un discorso qui in ufficio ha rivelato che jQuery fa la stessa cosa. Quindi potrei lasciarlo. Grazie per la buona risposta. –

Problemi correlati