2009-02-24 13 views
10

este fragmento da lugar a un error de ejecución de JavaScript: (foo no está definido)El uso de variables no definidas en las sentencias if

if (foo) { 
    // ... 
} 

tengo que definir foo primero, así:

var foo = foo || null // or undefined, 0, etc. 

... Y solo entonces puedo hacerlo:

if (foo) { 
    // ... 
} 

¿Por qué es eso?


Actualización:

Esto fue algo de un Brainfart en mi lado de las cosas: 'fcourse no puede acceder a una variable que no se ha asignado.

Cosas divertidas que puede hacer un typeof() en una variable indefinida tú. Voy a aceptar la respuesta de miccet, ya que creo que es la solución más elegante.

+0

[Esto] artículo (http://2ality.com/2013/04/check-undefined.html) 2ality menciones diferentes recomendada formas de verificar _undefined_, incluso interpretarlo como _falsy_ en contextos booleanos. – martieva

Respuesta

11

Tendrá que definirlo, para poder verificarlo por un valor. En este caso, estás revisando el clima, es cierto. Obviamente, esta variable no está configurada en absoluto, igual que nulo en C# y Nothing en VB, por ejemplo.

Si es necesario, problemas de depuración o lo que sea, se puede comprobar si la variable no está definida así:

if (typeof(variable) == "undefined") 
+0

Un pequeño y bonito fragmento. Muy elegante. Tendré eso en mente. Es extraño que pueda hacer un typeof() en una variable indefinida, pero no: if (undefinedVariable! == null). – roosteronacid

+1

Sí, he encontrado este bastante útil. Supongo que la razón es porque lo miras en vez de hacerlo, si tiene sentido. – miccet

+0

+1 esto es lo que iba a sugerir también. – cletus

1

Eso sería porque estás ahora definir con:

var foo = foo || null 

¿Por qué no lo defines en primer lugar? Eso parece bastante sencillo para mí (a menos que me falta algo).

Usar una variable antes de crearla (o establecerla en algo) es una mala práctica de programación, y debe evitarse. Mi consejo es no use ese truco para asegurarse de que está configurado para algo, pero para rastrear el error de lógica y solucionarlo.

0

Parece una extraña pregunta para mí. Digamos que quería llamar a una función: -

thing();

Si algo no se ha definido en ningún lugar seguramente esperaría que fallara.

¿Por qué esperas usar una variable llamada foo sin definirla en ningún lugar de tu código?

18

Tengo la sensación de que está preguntando porque sabe que javascript parece permitir variables indefinidas en algunas situaciones (es decir, sin errores de tiempo de ejecución) y no en otras.

El razonamiento es el siguiente: javascript siempre genera un error en la comprobación de variables no definidas, pero nunca se emite un error en la comprobación de las propiedades indefinido, siempre y cuando se usa solamente un nivel de indirección.

Ejemplo:

// throws runtime error 
if(foo) { 
    // ... 
} 

// does not throw runtime error 
if(window.foo) { 
    // ... 
} 

// does not throw runtime error 
var obj = {}; 
if(obj.foo) { 
    // ... 
} 

// throws runtime error 
if(obj.foo.bar) { // going two levels deep, but foo is undefined 
    // ... 
} 

la esperanza de que lo aclara un poco.

+1

Gracias por aclarar eso. – roosteronacid

0

Me parece un poco extraño. Para responderla Creo que lo mejor es hacer la pregunta al revés ...

¿Cuál sería el resultado esperado de

if (foo) { 
    // ... 
} 

donde foo no se define como una variable?

Creo que la única respuesta posible es que el if siempre se evaluaría como falso y nunca ejecutarías ese bloque.

Al hacerle una pregunta más directa, ¿por qué esperaría que el código funcionara, que se refiere a variables que no existen y que no han tenido valores asignados? ¿Qué es foo en el contexto que defines arriba?

En pocas palabras, sin la declaración la declaración subsiguiente no tiene ningún significado. foo no es un término que pueda evaluarse por sí mismo, por lo que debe darle al intérprete un contexto para la referencia de foo, de modo que pueda evaluarlo.

Existen idiomas que automáticamente crean variables para usted cuando se asignan por primera vez (python y VB comparten ese rasgo peligroso) pero incluso esos no podrán evaluar una variable antes de la asignación, por lo que los intérpretes arrojan errores.

Si tuviera un compilador te habría hablado de esto también ...

0

Ésta no es una pregunta extraña coz estoy en el mismo barco: p

que llegan aquí tras Google " javascript use variable undefined ". Me confundí porque he visto en alguna parte que las personas pueden simplemente usar variables indefinidas en un bucle.

Tal vez lo vi en un lenguaje diferente


lo he encontrado. Los primeros códigos se ejecutaron con éxito mientras que el segundo error de tiempo de ejecución del código.

primeros códigos:

test(); 
function test() { x = 4; } 
console.log(x); //this produce 4 

segundo códigos:

test(); 
function test() { x[0] = 1; } 
console.log(x[0]); 
Cuestiones relacionadas