2012-01-07 7 views
9
  • Istnieje continue; zatrzymać pętlę i przejść do pętli obok
  • Istnieje break; zatrzymać pętlę i przesunąć do końca pętli

nie jest jakiś rodzaj start;, które zatrzymują pętlę i przenoszą się do począwszy od pętli?Czy istnieje pętla "start-over"?

Wiem, że łatwo jest uzyskać wszystkie te trzy czynności, modyfikując tylko wartość i, ale zawsze staram się szukać już wbudowanych funkcji.

+0

można ponownie uruchomić pętlę po prostu odpoczynku licznik jak w pętli for można zresetować indeks 0, to restart – user889030

Odpowiedz

10

Nie - nie ma słów kluczowych lub inny sposób to zrobić automatycznie.

Jak już wspomniano, wystarczy zmodyfikować zmienną (y) pętli w pętli. To proste, jeśli jest to prosty licznik i, ale oczywiście możesz mieć więcej inicjalizacji niż zwykły licznik.

Albo można zrobić coś jak następuje:

restartLoop: 
while (true) { 
    for (var i=0, j=100000, x="test"; i < 1000; i++, j--, x+= ".") { 
     if (/*some condition, want to restart the loop*/) 
      continue restartLoop; 
    } 
    break; 
} 

continue restartLoop przeskoczy z powrotem, aby kontynuować następnej iteracji pętli while, które następnie natychmiast rozpoczyna pętlę for od początku w tym wszystkim kod inicjalizacyjny. Jeśli for kończy normalnie instrukcję break po jej wyrwaniu z pętli zawierającej.

Naprawdę nie polecam robić tego w ogólnym sensie, ale jeśli proces inicjalizacji pętli był naprawdę może być tego wart, ponieważ wtedy nie musiałbyś powtarzać tego wszystkiego w pętli. Jeśli potrzebna jest jeszcze większa inicjalizacja niż ładnie pasuje w wyrażeniu inicjalizacyjnym oświadczenia for, można z łatwością umieścić ją tuż przed pętlą for wewnątrz while i wszystko zostanie ponownie uruchomione ...

+1

Nie wiedziałem, że JS może to zrobić. Awesome – ajax333221

+0

Tak, 'continue' i' break' mogą być użyte razem z [label] (https://developer.mozilla.org/en/JavaScript/Reference/Statements/label), dzięki czemu można "kontynuować" lub " przerwać zewnętrzną pętlę od wewnątrz wewnętrznej pętli (przez tyle poziomów zagnieżdżenia, ile potrzeba). Oczywiście w mojej odpowiedzi nadużywałem tego trochę, ponieważ moja zewnętrzna pętla nie ma żadnego innego celu, jak tylko pozwolić na ponowne uruchomienie wewnętrznej pętli, ale w każdym razie jest więcej poważnych aplikacji, ponieważ jestem pewien, że możesz to sobie wyobrazić. – nnnnnn

+0

czy można oznaczyć początek pętli i użyć polecenia break, aby przejść do niego? (tak jest w tym przypadku, myślę, że znalazłem interesujący sposób osiągnięcia tego, co chcę). – ajax333221

1

continue prace po prostu omijając resztę ciała pętli. break działa poprzez pomijanie pozostałej części pętli, a następnie kończenie pętli. Funkcja "start" musiała w jakiś sposób "przewinąć" stan programu - ale nie cały stan programu, ponieważ prawdopodobnie nie chcesz stracić tego, co zrobiłeś, albo - do tego, gdzie był, kiedy zaczęła się pętla, to nie jest coś, co dostrzegłem w języku programowania.

+1

wątpię dane zostaną utracone, jeśli pętla zaczynając od 0, a ci po kilku pętlach Przypisanie wartości -1 spowoduje ponowne uruchomienie pętli. Używałem tego bardzo często. – ajax333221

+0

Tak - ale aby to zrobić automatycznie, język musi wiedzieć, która z nich jest zmienną pętli. –

7

Resetowanie wartości zmiennej pętli do wartości początkowej, a następnie wywoływanie continue jest tak blisko, jak to tylko możliwe.

Na przykład:

for(var i=0; i<20; i++) { 
    if(somecondition) { 
    i=-1; continue; 
    } 
} 
+4

Wierzę, że 'i = -1' jest bardziej przywłaszczone (mógłbym się mylić), to zależy od tego, czy' continue' zapobiega 'i ++' (co nie wiem) – ajax333221

+0

@ ajax333221 jest poprawne. 'continue' zdecydowanie przeskakuje do wyrażenia aktualizacji przed ponowną oceną warunku. – nnnnnn

+0

Nie trzeba testować, [doco] (https://developer.mozilla.org/en/JavaScript/Reference/Statements/continue#Description) mówi tak wyraźnie ... – nnnnnn

1

Można mieć pętli w funkcji, która wywołuje się rekurencyjnie:

function loopIt(numTimes) { 
      if (numTimes < 3) { 
       for (x = 0; x < 20; x++) { 
        if (x == 5) { 
         loopIt(numTimes+1); 
         break; 
        } 
       } 
      }  
     } 

Można oczywiście zmienić warunki, aby pasowały ci logiki jak powyżej jest prostym przykładem.

4

Jeśli chcesz uniknąć skoków lub ekwiwalentu instrukcji goto, których wielu z nas zostało przeszkolonych, aby ich uniknąć, możesz użyć funkcji lokalnej dla pętli i przetestować wartość zwracaną, aby sprawdzić, czy wystarczy to nazwać znowu:

function doItAll() { 
    // put state variables other than the actual loop control here 

    function doTheLoop() { 
     for(var i=0; i<20; i++) { 
      if (somecondition) { 
       return(true); // run the loop again 
      } 
     } 
     return(false); // done running the loop 
    } 
    while (doTheLoop()) {} 
    // do some things after the loop 
} 
+0

bardzo dobra rada – ajax333221

+0

To jest dobre rozwiązanie. Możesz go upiększyć i ulepszyć, nadając tej samej funkcji. – Bitterblue