2009-11-10 20 views
18

En esencia, estoy tratando de declarar una variable en la condición de parte de un bucle while en javascript:declaración de variable en condiciones mientras en javascript

while (var b=a.pop()) { 
    do_sth(b) 
} 

Sin embargo, mi navegador (Firefox) no lo hace Acepta eso. En su lugar tengo que ir así:

var b 
while (b=a.pop()) { 
    do_sth(b) 
} 

que funciona. ¿Se espera este comportamiento?

+1

Los 2 siguientes explican la elevación de la declaración de la variable pero no explican por qué no se puede declarar una variable dentro de una condición 'while' (pero se puede, por ejemplo, en una condición' for'). ¿Alguna vez encontró una buena explicación para esto? – Barney

+2

Otra peculiaridad de JS, por eso. –

Respuesta

16

JavaScript no tiene alcance de bloque. Tiene alcance de función. Por lo tanto, para asegurarse de que los humanos y JavaScript lean el código de la misma manera, debe elevar manualmente sus declaraciones var hasta la parte superior de las funciones.

Esto es lo que dice acerca de su JSLint código:

Problem at line 1 character 8: Expected an identifier and instead saw 'var'. 

Uso JSLint, al menos mientras se está aprendiendo JavaScript. Aprenderás mucho rápidamente. Herirá tus sentimientos.

+0

Esto ya no es el caso con let – Ced

23

Sí, lo es.

Si desea, puede utilizar un bucle for, así:

for (var b; b = a.pop();) {  //Note the final semicolon 
    do_sth(b); 
} 
6

JavaScript no tiene ámbito de bloque. Entonces todas las declaraciones var están en el alcance de la función. Entonces, declarar una variable en una expresión while no tiene sentido en JavaScript.

Además, debe terminar sus declaraciones con un punto y coma. No es estrictamente necesario, pero es muy recomendable.

16

La pregunta es un poco anticuada, pero creo que todas las respuestas omiten una distinción importante. Es decir, un bucle while espera una expresión que evacua a un condicional, es decir, un valor booleano o que se puede convertir en un booleano. Ver Mozilla docs para más detalles.

Una asignación pura (sin instanciación) se fuerza a un booleano a través de su valor de retorno predeterminado (el valor del lado derecho).

Un var (o let o const) es una declaraciónque permite una asignación opcional, pero tiene un valor de retorno de undefined.

Usted puede probar fácilmente esto en la consola:

var foo = 42; // undefined 
bar = 42  // 42 

Los valores devueltos por sí solas no responder a la pregunta, ya que es undefined Falsey-, pero sí muestra que incluso si JS le permiten poner un var en una condicional, simplemente siempre evaluaría a falso.

Otros han mencionado for declaraciones y que permiten la declaración y creación de instancias de las variables. Esto es cierto, pero el documentation explains que for espera una declaración o una asignación.

Las opiniones pueden variar, pero para mí todo esto se suma a una consistencia comprensible, no a una peculiaridad en el comportamiento con respecto a los bucles.Un bucle while se considera mejor como una versión de bucle de una instrucción if que similar a un bucle for. Si hay algo raro en todo esto, es la divergencia total de la declaración for de la sintaxis normal del lenguaje.

+2

Estaba buscando '¿por qué?' javascript no permite const, let, var inside while condicionales y esto respondió mi pregunta. Siempre me pareció confuso que la consola informara indefinida cuando creé una nueva variable, en lugar del valor de la variable. Todavía no veo el punto de que javascript devuelva indefinido; también pueden devolver el valor de la variable, pero si devuelve indefinido, mejores navegadores y errores de compiladores cuando se usan en condicionales. –

Cuestiones relacionadas