2012-01-07 16 views
9
  • Hay continue; para detener el bucle y se mueven al bucle siguiente
  • Hay break; para detener el bucle y pasar a la final del bucle

no hay alguna tipo de start; que detiene el ciclo y pasa al comenzando del ciclo?¿Hay un ciclo de "inicio"?

Sé que es fácil lograr todas estas tres acciones simplemente modificando el valor de i, pero siempre trato de buscar funciones ya construidas.

+0

puede reiniciar bucle simplemente descansar mostrador como en bucle for puede restablecer índice a 0, se reiniciará – user889030

Respuesta

10

No - no hay palabras clave u otra manera de hacerlo automáticamente.

Como ya lo mencionó, puede modificar las variables de condición de ciclo dentro de su ciclo. Es fácil si se trata de un simple contador i, pero, por supuesto, puede tener más inicialización que hacer que un simple contador.

O puede hacer algo como lo siguiente:

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

El continue restartLoop saltará de vuelta para continuar con la siguiente iteración del bucle while, que luego se inicia inmediatamente el bucle for desde el principio que incluye todos el código de inicialización. Si el for sale normalmente de la instrucción break después de que saldrá del bucle while que contiene.

Realmente no recomiendo hacer esto en un sentido general, pero si su proceso de inicialización de bucle fue realmente complicado, podría valer la pena porque entonces no tendría que repetir todo dentro del bucle. Si necesita hacer aún más inicializaciones de las que se ajustan bien en la expresión de inicialización de la declaración for, puede colocarlas fácilmente antes del for dentro del while y todo se volverá a ejecutar ...

+1

No sabía que JS podría hacer eso. Impresionante – ajax333221

+0

Sí, 'continue' y' break' se pueden usar con una [etiqueta] (https://developer.mozilla.org/en/JavaScript/Reference/Statements/label) para que pueda 'continuar' o' romper' un bucle externo desde el interior de un bucle interno (a través de tantos niveles de anidación como se desee). Por supuesto en mi respuesta he abusado de esto un poco ya que mi ciclo externo no tiene otro propósito que no sea permitir el reinicio del circuito interno, pero de todos modos hay aplicaciones más serias que estoy seguro que puedes imaginar. – nnnnnn

+0

¿es posible etiquetar el comienzo de un ciclo y usar el salto para saltar a él? (es ese el caso, creo que encontré una forma interesante de lograr lo que quiero) – ajax333221

1

continue obras simplemente omitiendo el resto del cuerpo del bucle. break funciona omitiendo el resto del cuerpo del bucle y luego terminando el bucle. Una función start tendría que "rebobinar" de alguna manera el estado del programa, pero no todo el estado del programa, ya que presumiblemente tampoco quieres perder lo que hiciste, donde estaba cuando comenzó el ciclo, que no es algo que proporcione ningún lenguaje de programación que haya visto.

+1

dudo se perderán los datos, si bucle comenzando en 0 y después de algunos bucles asigna el valor de -1 comenzará a repetirse. Lo he usado muy a menudo. – ajax333221

+0

Sí, pero para hacer esto automáticamente, el idioma necesita saber cuál es la variable de ciclo. –

7

Restablecer el valor de la variable de bucle al valor inicial y luego llamar al continue es lo más cercano que obtendrá.

Por ejemplo:

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

Creo que 'i = -1' es más apropiado (podría estar equivocado), depende de si el 'continuar' impide el' i ++ '(que no sé) – ajax333221

+0

@ ajax333221 es correcto. 'continue' definitivamente salta a la expresión de actualización antes de volver a evaluar la condición. – nnnnnn

+0

No es necesario probar, [el doco] (https://developer.mozilla.org/en/JavaScript/Reference/Statements/continue#Description) dice tan explícitamente ... – nnnnnn

1

Usted podría tener el bucle en una función que se llama de forma recursiva:

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

Obviamente se puede cambiar las condiciones de encajar lógica que el anterior es un ejemplo sencillo.

4

Si desea evitar los saltos o el equivalente de las declaraciones goto que muchos de nosotros hemos sido entrenados para evitar, puede usar una función local para el ciclo y una prueba del valor de retorno para ver si simplemente lo llama de nuevo:

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

muy buen consejo – ajax333221

+0

Esta es una buena solución. Sin embargo, puedes embellecerlo y realzarlo al poner por y para la misma función. – Bitterblue

Cuestiones relacionadas