2011-07-05 6 views
6

bien, esto me está volviendo loco:¿Alguna vez has visto este raro comportamiento/error de JavaScript de IE?

Primer ejemplo, no hay problema:

<script> 

window.myvar = 150; 

if (false) { 
    var myvar = 3; 
} 

// This will popup "150" 
alert(myvar) 

</script> 

Ahora, con dos elementos de script:

<script> 

window.myvar = 150; 

</script> 

<script> 

if (false) { 
    var myvar = 3; 
} 

// This will popup "undefined" 
alert(myvar) 

</script> 

probado con IE8.

¿Tiene alguna idea de por qué?

+0

¿Puede usted por favor comprobar si el código en http://tinypaste.com/49c80 muestra el mismo error que el anterior, por lo que puedo ¿responde tu pregunta? No puedo probar porque no estoy usando mi caja de Windows en este momento. Ad @ m – kirb

+0

Ojalá tuviera IE8 para probar en este momento. Suena como que la definición de 'myvar' se iza y sombrea la propiedad de' window'. – alex

+0

@adam ese código prueba OK en IE7/8, alerta 100 – clairesuzy

Respuesta

4

Dentro del segundo ejemplo, en su segundo bloque script, myvar ha estado hoisted (según la especificación) en la parte superior del ámbito que lo contiene. Recuerde que JavaScript no tiene alcance de bloque, solo alcance de función.

Por lo tanto, var myvar (izada la definición que se interpreta) va a llevar a myvar siendo undefined cuando el alert() mira hacia arriba en la myvarVariableObject.

+0

todavía no está claro, ¿qué se iza? –

+0

@sushil Agregué un enlace que explica de forma útil cómo izar con más detalle. – alex

+0

gracias, ahora está claro.No sé por qué funciona de manera diferente en otro navegador, aunque – Claudio

0

Esto no me pasa en iOS Safari en 4.3.1, por lo que podría ser un error en IE. Sin embargo, la respuesta de @ alex también puede ser cierta también. Ad @ m

0

Estoy para izar, como dijo alex. El compilador ve que define myvar en su bloque (var myvar dentro de if) y iza el conocido myvar. Aunque no estoy seguro de si es un error o una característica.

3

Eso es porque desde javascript no alcance basado en los niveles de función, su código computa/compila/equivalente a lo siguiente:

<script> 

window.myvar = 150; 

</script> 

<script> 
var myvar; 

if (false) { 
    myvar = 3; 
} 

// This will popup "undefined" 
alert(myvar) 

</script> 
+0

OK, así que esto tiene algo que ver con el cambio variable. Parece solo en IE, sin embargo. – Claudio

+0

Ejemplo de jsbin: http://jsbin.com/upexat/6/edit#source y otra versión http://jsbin.com/upexat/8/edit#source – Ajaxe

1

Hay un poco más también él que Alex dijo (a pesar de que acaba de hacer referencia a mi artículo - ¡Gracias!).

Si la secuencia de código estaba en la secuencia que aparece, "var myVar" no se izaría (o más bien su elevación no tendría ningún efecto) porque "window.myvar = 150" es definido primero (además, esto wouldn ' t explicar por qué funcionó el primer ejemplo y el segundo solo falló en IE)

Parece que el segundo script se carga (de alguna manera) antes que el primero, pero solo en IE8. Se puede simular el cambio de la secuencia de la etiqueta y verá alerta indefinida en todos los navegadores

var myvar; 

if (false) { 
    myvar = 3; 
} 

alert(myvar) 

window.myvar = 150; 
Cuestiones relacionadas