2012-06-20 21 views
8

Estoy en el proceso de depurar Javascript de otro desarrollador para un proyecto en el trabajo.Javascript for loop missing media part: error or advanced?

Probablemente soy una de nivel medio Javascript desarrollador en un buen día y me he encontrado con un bucle for que aparece roto:

for(i = 0; ; i++) 

Puede alguien decirme si esto es de hecho un error o si en En algunos casos, esta es una manera perfectamente válida de hacer cosas avanzadas.

+0

Por avanzado me refiero a encapsulación, recursividad, cierres, etc. Cosas que no entiendo completamente. Gracias. – timmackay

+0

Esta es una buena pregunta. – Pointy

Respuesta

4

Está bien y perfectamente legal. Se puede dejar cualquiera de los tres espacios en una declaración for vacío. A excepción de la condición que he añadido, es lógicamente el mismo que esto:

i = 0; 
while (true) { 
    // other code here 
    if (some condition) { 
     break; 
    } 
    i++; 
} 

Será un bucle infinito a menos que haya una prueba en alguna parte del bucle que emite una declaración break bajo algunas condiciones para detener el bucle (Agregué una prueba de muestra a mi ejemplo de código).

+0

Eso tiene sentido, si aún es un poco confuso. Gracias por responder. – timmackay

+0

Además, (probablemente estoy siendo quisquilloso con los detalles, pero como usted hizo una edición para usted, indicando que la única diferencia es la declaración if que agregó, continuaré y) señalaré que el código original no lo hace 't use la palabra clave 'var' así que en el' i' original puede ser global y aquí es local para cualquier ámbito en el que se encuentre el bucle. Sin embargo, eso es lo que se pretende de todos modos, pero si el OP tiene 'var i;' en alguna parte más temprano en la función que está en esto sería una declaración de variable redundante para repetirlo. – Paulpro

+0

@ ascii-lime - OK, saqué la 'var'. – jfriend00

1

Está perfectamente bien siempre y cuando dentro del ciclo haya una declaración break.

Si no hay declaración de interrupción, el tiempo de ejecución de JavaScript continuará ejecutando el código en el bucle, una y otra vez, con "i" creciendo, creciendo y creciendo. Pronto, "yo" se convertirá en un número más grande que cualquier cosa; más grande que la cantidad de Legos que el niño rico que conocías en la escuela tenía incluso en su sala de juegos. Irá más allá de eso para ser un número más grande que la cantidad de hormigas en el mundo, luego la cantidad de Starbucks, luego la cantidad de moléculas de agua en el océano. En algún momento, el navegador podría preguntar si desea detener el script, pero si tiene curiosidad, si es el tipo de persona a la que le gusta explorar lo desconocido, rechazará la oferta y la dejará pasar. Pronto el valor de "i" alcanzará valores verdaderamente astronómicos, y las cosas se volverán interesantes. ¿Recuerdas que en 2001 A Space Odyssey las cosas se pusieron raras cuando el tipo fue atrapado en Júpiter o lo que sea? Bueno, podría ser así.

Pruebe un jsfiddle.

3

Eso es válido. Cada una de las tres expresiones en el bucle for for(expr1; expr2; expr3) puede estar vacía. Por ejemplo, for(; ;) es lo mismo que while(true).

expr1 es una expresión que se ejecuta una vez justo antes de que comience el ciclo. También puede tener aquí una declaración de declaración de variable en lugar de una expresión que es lo que tiene en su código.
expr2 es una expresión que se ejecuta justo antes de cada iteración del ciclo, y si el valor de la expresión es falso, el ciclo está hecho. Si la expresión se omite, se considera verdad.
expr3 es una expresión que se ejecuta justo después de cada iteración del ciclo.

La declaración que tienes es esencialmente un while(true) bucle (que debe contener una declaración break algún lugar dentro de él, que cuenta el número de veces que itera a través de la variable i.

+0

Gracias por la explicación. En mi nivel, me apegaré a loops básicos pero es bueno saber que son más flexibles de lo que pensé. – timmackay

1

Es un enfoque válido para hacer un infinito con un contador de incremento. Si eso es intencional o no, es una cuestión completamente diferente, por lo que personalmente estoy en contra de utilizar bucles for en casos como ese. Sin duda, el comentario solucionaría cualquier problema con dicho uso

0

El lazo tiene una sintaxis sencilla:

  1. Declaración de variables => i = 0
  2. Loop cheque enterance_nus =>
  3. Creación de otro bucle => i ++

Debido JavaScript devuelve true para nada (corríjame si me equivoco), luego la comprobación de enterance de bucle siempre es verdadera.

Esto no es una buena práctica en absoluto. Por lo tanto, creo firmemente que este es un código roto. Nunca he visto un ejemplo de ciclo infinito por diseño.