2011-02-05 11 views
34

Właśnie się dowiedziałem o używaniu etykiet s w JavaScript, takie jak:Czy używasz etykiet w złym ćwiczeniu JavaScript?

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

doThis: //Label 
doIt(); 

nie słyszałem o tym dopiero teraz i nie mogę znaleźć wiele informacji w Internecie o tym, a ja zaczynam myśleć Jest ku temu powód.

Wydaje mi się, że jest to podobne do oświadczenia GOTO w innych językach i byłoby uważane za złą praktykę. Czy miałbym rację, zakładając to?

+5

korzystanie z etykietami jest niepoprawna: trzeba dodać etykietę do zapętlenie konstruktem, czyli 'doThis: for (...' – Christoph

+5

Również ** nie używając ** ' hasOwnProperty' to zdecydowanie zła praktyka. Zobacz: http://bonsaiden.github.com/JavaScript-Garden/#hasownproperty –

+1

@IvoWetzel jeśli jest to obiekt, który nie dziedziczy, dobrze jest nie używać 'hasOwnProperty'. Nic z prototypu 'Object' nie jest przeliczalne. – ZachB

Odpowiedz

21

To są identyfikatory wyłącznika pętli. Są użyteczne, jeśli masz zagnieżdżone pętle (pętle wewnątrz pętli) i używając tych identyfikatorów, możesz warunkowo określić, kiedy i z której pętli się wyrwać.

+0

Ahh, więc nie możesz się włamać do kodu, który nie jest w pętli? – Ryan

+1

@Ryan: Nie musisz wyłamywać kodu, który nie znajduje się w pętli. Chyba chcesz użyć czegoś takiego jak "PRZEJDŹ". Możesz postawić warunki używając 'if' zamiast tego. – Sarfraz

+0

'Są użyteczne, jeśli masz zagnieżdżone pętle' lub instrukcję' switch' wewnątrz pętli, która używa słowa kluczowego 'break' również do sterowania. – amn

41

Etykiety w JavaScript są wykorzystywane głównie z przerwą lub kontynuować w zagnieżdżonych pętlach, aby móc przełamać zewnętrzna lub kontynuować zewnętrzną pętlę z kodu wewnątrz pętli wewnętrznej:

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 
    } 

Jeśli użyto kontynuowania bez etykiety "zewnętrznej", przejdzie do kolejnej iteracji pętli wewnętrznej. Dlatego istnieje potrzeba etykiet w JavaScript.

+3

Po prostu zastanawiam się ... co robi zmienna "k" w powyższym kodzie? – Danield

+1

BTW, let jest słowem kluczowym ecmascript 6/ecmascript 2015. https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Statements/let –

+0

@Danield nic. – Walf

10

Unikaj używania etykiet

Etykiety nie są bardzo powszechnie stosowane w JavaScript, ponieważ sprawiają programy trudniejsze do odczytania i zrozumienia. O ile to możliwe, należy unikać używania etykiet i, w zależności od przypadków, preferować wywoływanie funkcji lub zgłaszać błąd.

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

+12

Ten tekst został [usunięty] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/label $ compare? Locale = en-US i to = 805661 & from = 784289) z MDN w maju 2015 r., Z [te komentarze] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statement/label $ history) w historii wersji: * "Usunięcie zalecenia nieobsługiwane wyraźnymi dowodami." "Czyszczenie przeglądu technicznego." "Myślę, że to prawda, że ​​nie ma potrzeby, aby duży czerwony baner zniechęcał etykiety." Nie znalazłem niczego, co mówi inaczej. "* – TachyonVortex

+0

Dzięki za aktualizację! –

+1

czy to prawda, etykiety i goto zostaną usunięte http://es5.github.io/#x12.12 –

0

oznaczone przerwy może wyrwać się z dowolny blok kodu nie tylko pętle

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

wynik:

test 1 przeszedł

t est 2 przeszedł

test 3 przeszły

Powiązane problemy