2012-01-07 17 views
9
  • C'è continue; per fermare il ciclo e passare al ciclo successivo
  • C'è break; per fermare il ciclo e spostarsi alla fine del ciclo

non c'è qualche tipo di start; che interrompe il loop e passa allo all'inizio del ciclo?C'è un ciclo "start-over"?

So che è facile realizzare tutte queste tre azioni semplicemente modificando il valore di i, ma cerco sempre di cercare funzioni già integrate.

+0

è possibile riavviare loop solo riposando banco come nel ciclo for è possibile reimpostare indice 0, si riavvia – user889030

risposta

10

No - non c'è parola chiave o altro modo per farlo automaticamente.

Come già accennato, è possibile modificare le variabili di condizione del ciclo all'interno del loop. Facile se si tratta di un semplice contatore i, ma ovviamente è possibile avere più inizializzazioni da fare rispetto a un semplice contatore.

Oppure si può fare qualcosa di simile al seguente:

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

Il continue restartLoop salterà di nuovo fuori per continuare con la prossima iterazione del while ciclo, che poi inizia immediatamente il loop for dall'inizio compresi tutti il codice di inizializzazione. Se lo standard for esce normalmente dall'istruzione break dopo l'interruzione del ciclo while contenente.

Non consiglio davvero a fare questo in senso generale, ma se il processo di ciclo di inizializzazione era davvero complicato potrebbe essere vale la pena perché allora non avrebbe bisogno di ripetere il tutto all'interno del ciclo. Se è necessario eseguire un'inizializzazione ancora maggiore di quella che si adatta perfettamente all'espressione di inizializzazione dell'istruzione for, è possibile inserirla facilmente prima del ciclo for all'interno dello while e verrà eseguito di nuovo ...

+1

Non sapevo che JS potesse farlo. Impressionante – ajax333221

+0

Sì, 'continue' e' break' possono essere entrambi usati con una [etichetta] (https://developer.mozilla.org/en/JavaScript/Reference/Statements/label) in modo da poter 'continuare' o' rompere un anello esterno dall'interno di un anello interno (attraverso tutti i livelli di annidamento desiderati). Naturalmente nella mia risposta ho abusato di questo un po 'da quando il mio ciclo esterno non ha altro scopo se non quello di consentire il riavvio del ciclo interno, ma comunque ci sono applicazioni più serie come sono sicuro che tu possa immaginare. – nnnnnn

+0

è possibile etichettare l'inizio di un ciclo e utilizzare l'interruzione per saltare ad esso? (è così, penso di aver trovato un modo interessante per ottenere quello che voglio) – ajax333221

1

continue opere semplicemente saltare il resto del corpo del ciclo. break funziona saltando il resto del corpo del ciclo e quindi terminando il ciclo. Una funzione start dovrebbe in qualche modo "riavvolgere" lo stato del programma - ma non tutto lo stato del programma, dal momento che presumibilmente non si vuole perdere ciò che si è fatto, sia dove era quando è iniziato il ciclo, che non è qualcosa che qualsiasi linguaggio di programmazione che ho visto fornisce.

+1

dubito i dati andranno persi, se si esegue un ciclo partendo da 0 e dopo alcuni loop assegna il valore -1, ricomincerà il ciclo. L'ho usato molto spesso. – ajax333221

+0

Sì - ma per farlo automaticamente la lingua deve sapere quale sia la variabile di loop. –

7

Reimpostare il valore della variabile loop sul valore iniziale, quindi chiamare continue è il più vicino possibile.

Ad esempio:

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

Credo che 'i = -1' sia più appropriato (potrei sbagliarmi), dipende dal fatto che' continue' impedisca il 'i ++' (che non conosco) – ajax333221

+0

@ ajax333221 sia corretto. 'continue' salta definitivamente all'espressione di aggiornamento prima di rivalutare la condizione. – nnnnnn

+0

Non c'è bisogno di testare, [il documento] (https://developer.mozilla.org/en/JavaScript/Reference/Statements/continue#Description) dice così esplicitamente ... – nnnnnn

1

Si potrebbe avere il ciclo in una funzione che si chiama in modo ricorsivo:

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

ovviamente è possibile modificare le condizioni per adattarsi a voi la logica come il sopra è un semplice esempio.

4

Se si desidera evitare salti o l'equivalente di istruzioni goto che molti di noi sono stati addestrati per evitare, è possibile utilizzare una funzione locale per il ciclo e un test sul valore restituito per vedere se è necessario chiamarlo ancora:

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

consiglio molto bello – ajax333221

+0

Questa è una buona soluzione. Eppure puoi abbellirlo e migliorarlo inserendo per sempre la stessa funzione. – Bitterblue