2011-02-05 10 views
34

Ho appena scoperto sull'utilizzo di etichette s in JavaScript, come ad esempio:Sta usando le etichette nella cattiva pratica di JavaScript?

for (var i in team) { 
    if(i === "something") { 
     break doThis: //Goto the label 
    } else { 
     doThat(); 
    } 
} 

doThis: //Label 
doIt(); 

Non ho sentito parlare di questo fino ad ora e non riesco a trovare molte informazioni on-line su di esso e sto cominciando a pensare c'è una ragione per questo.

Mi sembra che questo è simile a una dichiarazione GOTO in altre lingue e sarebbe considerato una cattiva pratica. Avrei ragione ad assumerlo?

+5

l'utilizzo di etichette non è corretto: è necessario aggiungere l'etichetta al costrutto iterativo, cioè 'dothis: per (...' – Christoph

+5

Inoltre ** non ** usando ' hasOwnProperty' è decisamente una cattiva pratica. Vedi: http://bonsaiden.github.com/JavaScript-Garden/#hasownproperty –

+1

@IvoWetzel se si tratta di un oggetto che non eredita, va bene non utilizzare 'hasOwnProperty'. Nulla sul prototipo 'Object' è enumerabile. – ZachB

risposta

21

Questi sono identificatori di interruttori di loop. Sono utili se si hanno cicli annidati (loop all'interno di loop) e si utilizzano questi identificatori, è possibile specificare condizionalmente quando e da quale ciclo uscire.

+0

Ah, quindi non puoi scomporre in codice che non si trova all'interno di un loop? – Ryan

+1

@Ryan: non è necessario interrompere il codice che non si trova all'interno di un ciclo. Supponiamo che tu voglia usare qualcosa come GO TO TO. Puoi mettere le condizioni usando 'if' invece. – Sarfraz

+0

'Sono utili se hai cicli annidati': o un'istruzione' switch' in un ciclo, che usa anche la parola chiave 'break' per il controllo. – amn

41

Le etichette in JavaScript sono utilizzati principalmente con pausa, o continuare a cicli annidati per essere in grado di rompere l'esterno, o continuare il ciclo esterno dal codice all'interno ciclo interno:

outer: 
    for (let i = 0; i < 10; i++) 
    { 
     let k = 5; 
     for (let j = 0; j < 10; j++) // inner loop 
      if (j > 5) 
       break; // inner 
      else 
       continue outer; // it will go to next iteration of outer loop 
    } 

Se è stato utilizzato continua senza etichetta 'esterna', passerebbe alla successiva iterazione del ciclo interno. Ecco perché c'è bisogno di etichette in Javascript.

+3

Solo chiedendo .... cosa fa la variabile 'k' nel codice sopra ?? – Danield

+1

BTW, let è una parola chiave ecmascript 6/ecmascript 2015. https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Statements/let –

+0

@Danield niente. – Walf

10

Evitare di utilizzare etichette

Le etichette non sono molto comunemente utilizzati in JavaScript poiché rendono programmi più difficili da leggere e capire. Per quanto possibile, evitare usando le etichette e, a seconda dei casi, preferire le funzioni di chiamata o lanciare un errore.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/label

+12

Quel testo è stato [rimosso] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Riferimento/Dichiarazioni/etichetta $ compare? Locale = en-US & a = 805661 & from = 784289) da MDN a maggio 2015, con [questi commenti] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Riferimento/Dichiarazioni/etichetta $ cronologia) nella cronologia delle revisioni: * "Rimozione della raccomandazione non supportata da prove chiare". "Rassicurando la revisione tecnica, penso sia vero che non ci sia bisogno del grande banner rosso che scoraggia le etichette, Havent ha trovato qualcosa che dice diversamente." * – TachyonVortex

+0

Grazie per l'aggiornamento! –

+1

è vero etichette e goto sarà rimosso http://es5.github.io/#x12.12 –

0

etichettato interruzioni possono rompere su qualsiasi blocco di codice non solo passanti

<p id="test1"></p> 
<p id="test2"></p> 
<p id="test3"></p> 
<p id="test4"></p> 
<p id="test5"></p> 

test: {        
    document.getElementById('test1').innerHTML = "test 1 passed"; 
    document.getElementById('test2').innerHTML = "test 2 passed"; 
    document.getElementById('test3').innerHTML = "test 3 passed"; 
    break test; 
    document.getElementById('test4').innerHTML = "test 4 passed"; 
    document.getElementById('test5').innerHTML = "test 5 passed"; 
} 

risultato:

prova 1 superato

t est 2 superato

test 3 passata

Problemi correlati