9

(la creación de una pregunta separada después de los comentarios de esta: Javascript redeclared global variable overrides old value)redeclarada Javascript anulaciones de variables antiguo valor global en IE

Estoy creando un ámbito global variable usando la notación de corchetes y asignarle un valor dentro de archivo de una externa js .

En otro archivo js declaro una var con el mismo nombre que acabo de crear. Tenga en cuenta que no estoy asignando un valor. Dado que este es un redeclaración de la misma variable el valor anterior no debe ser anulado como se describe aquí: http://www.w3schools.com/js/js_variables.asp

crear 2 archivos javascript con el siguiente contenido: script1

//create global variable with square bracket notation 
window['y'] = 'old'; 

SCRIPT2

//redeclaration of the same variable 
var y; 

if (!y) y = 'new'; 

alert(y); //shows New instead of Old in IE 

Incluya estos 2 archivos en su archivo html

<html> 
<head></head> 
<body> 

    <script type="text/javascript" src="my.js"></script> 
    <script type="text/javascript" src="my2.js"></script> 

</body> 
</html> 

Al abrir esta página en Firefox y las alertas de Chrome 'viejo', que es el comportamiento esperado. Sin embargo, en IE 8 la página realmente alertará 'nuevo'

¿Alguna idea sobre por qué sucede esto en IE?

+0

¿Qué sucede si pone todo el código en línea en el archivo HTML? Me da el mismo resultado (antiguo) en Firefox 3.5.8, Chrome 5.0.342.7 y Konqueror 4.3.5. Los resultados para otros navegadores serían útiles. –

+0

Si coloca todo el código en un archivo, se produciría un enganche y es probable que el problema no esté presente. –

+0

Sí, si pones todo el código en un solo lugar, la alerta muestra 'viejo' en todos los navegadores –

Respuesta

4

Si espera que y sea global, puede simplemente colocar la línea var y en su segundo archivo.

El razonamiento detrás de esto es que, como quiera que y sea global de todos modos, simplemente trátelo como si fuera global y ya declarado. El efecto secundario de JavaScript de hacer que las variables sean globales cuando se declara sin el prefijo var juega a su favor en esta situación. Probado en IE8, esto funciona bien.

Editar: En cuanto a por qué sucede esto, me gustaría atribuirlo simplemente a ser un error en una combinación de manejo de IE de globales en archivos y levantamiento de declaraciones. Realmente, sin embargo, solo deberías declarar cualquier variable, pero especialmente global, en un solo lugar. Su problema se puede evitar siguiendo esta regla de oro.

+1

Gracias por esa sugerencia. Tiene sentido. Aunque todavía sería interesante saber por qué esto no se comporta correctamente en IE. –

+1

Sorprendentemente, parece que IE puede tener un error en su implementación de JavaScript. –

+0

Sí, idealmente querríamos declarar un global en un solo lugar. Mi caso de uso fue que tenía varios archivos js, cada uno de los cuales declaraba una clase de espacio de nombres con este patrón: Script1: if (! A) a = {}; a.b = function() {....}; Script2 if (! A) a = {}; a.c = function() {....}; Ahora esto funciona bien hasta que el primer script usa window.a o ventana ['a'] para declarar a y luego IE se rompe. Dado que varias páginas pueden elegir qué archivos incluir, cada una de ellas debe verificar si existe. –

1

Esto está sucediendo en IE porque la línea de re-declaración está configurando y a indefinido. A continuación, la prueba de línea si y no se establece pasa y y cambia a "nuevo".

Cambia la segunda secuencia de comandos para:

//redeclaration of the same variable 
var y; 

alert(y); // is undefined in IE 

if (!y) y = 'new'; 

alert(y); //shows New instead of Old in IE 
+0

Derecha, entiendo eso. Pero si combinara los contenidos de los 2 archivos en un solo lugar, ya no estaría indefinido y la redeclaración no establecería y no sería indefinido. Como resultado, la alerta mostraría 'viejo' –

+0

En IE todas las declaraciones se ejecutan antes que otras partes del código. En el segundo incluir si haces la alerta de primera línea (ventana ['y']) verás que el valor no está definido. Si comenta la línea de redeclaración, verá aparecer el 'viejo' esperado. – Jonathan

+0

En realidad, esto sucede en todos los navegadores y se llama * elevación *; sin embargo, parece que IE lo está haciendo mal en este escenario y provoca una sobrescritura. –

9

caso de prueba simplificado:

<script> 
    window.foo= 1; 
</script> 
<script> 
    var foo; 
    alert(foo); 
</script> 

Y sí, esto absolutamente es un error en el motor de JScript de IE.

¿Por qué sucede? ¿Por qué IE hace alguna de las locuras que hace? Haga un ruido irritado, siga adelante, trate de evitar hacer esto ...

+0

Bien, finalmente no estoy loco. –

+2

Si lo has reducido a "algo malo contigo" y "algo está mal con IE", ve con IE siempre ... – bobince