2012-03-30 14 views
5

¿Qué cosa está haciendo el segundo parámetro return true?¿Por qué este 'por (;;)' bucles?

ADVERTENCIA: se hará en bucle infinito y se puede bloquear el navegador

for(;;){ 
    //... 
} 

que estaba esperando totalmente no bucle en todo ...

Pero se está ejecutando, y eso lo empeora ya que solo se puede ejecutar si algo se evaluó en true, o ¿me falta algo?

+3

Si no se proporciona ninguna condición, se ejecuta un bucle for hasta que salga de él. Es lo mismo en C. –

+0

Ver http://stackoverflow.com/questions/4894120/special-for-loop-syntax/4894256#4894256 - exactamente lo mismo en Java y JavaScript que en C y C++. – paxdiablo

Respuesta

7

De forMDN

for ([initialization]; [condition]; [final-expression]) 
    statement 

[Initialization] y [final-expression] intuitivamente no son necesarios, lo que reduce el constructo a un simple bucle while. Pero la parte pertinente es:

condición
Una expresión para ser evaluados antes de cada iteración del bucle. Si esta expresión se evalúa como verdadera, se ejecuta la instrucción. Esta prueba condicional es opcional. Si se omite, la condición siempre se evalúa como verdadera. Si la expresión se evalúa como falsa, la ejecución se salta a la primera expresión que sigue al constructo for.

(el énfasis es mío)

Ésta parece ser una decisión de diseño lenguaje totalmente arbitraria JS. Si fuera mi idioma, probablemente lanzaría un error de sintaxis.


En una nota lúdica, for(;;){} es equivalente a while(true){}, y pasa a ser 4 caracteres más corta. Me pregunto si los minificadores aprovechar esto!

+0

buena referencia, confío totalmente en cada palabra de ese sitio – ajax333221

4

Debido a la falta de una condición siempre se evaluará como true.

+0

¿De verdad? Eso es un poco cursi. ¿Es así como funciona en todas partes en Java? Como en 'if()'? –

+0

@RobertHarvey, la sintaxis evita que 'if()' no tenga una condición, pero no impide 'for()'. – rid

1

No hay nada “haciendo el segundo parámetro de retorno true”. No hay un segundo parámetro La sección 12.6.3 del ECMAScript Language Specification (ECMA-262 5th Edition) dice esto:

a. Si la primera Expresión está presente, entonces

i. Deje testExprRef ser el resultado de la evaluación de la primera Expresión.

ii. Si GetValue (testExprRef) es falsa, de retorno (normal, V, empty).

La “primera expresión” que se refiere es la expresión opcional entre los puntos y comas de la declaración for. Si está presente, el programa realiza los pasos (i) y (ii) citados anteriormente. Si la expresión no está presente, el programa simplemente no realiza los pasos (i) y (ii) del algoritmo de instrucción for.