La variabile globale javascript redeclar sostituisce il vecchio valore in IE

(creando una domanda separata dopo i commenti su questo: la variabile globale redisclamata da JavaScript sovrascrive il vecchio valore )

Sto creando una variabile con ambito globale usando la notazione della parentesi quadra e assegnandole un valore all’interno di un file js esterno.

In un altro file js dichiaro una var con lo stesso nome di quella che ho appena creato sopra. Nota Non sto assegnando un valore. Poiché si tratta di una ridichiarazione della stessa variabile, il vecchio valore non deve essere ignorato come descritto qui: http://www.w3schools.com/js/js_variables.asp

Crea 2 file javascript con il seguente contenuto: 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 

Includere questi 2 file nel file html

        

Apertura di questa pagina in Firefox e avvisi di Chrome ‘vecchi’, che è il comportamento previsto. Tuttavia in IE 8 la pagina in realtà avviserà ‘nuova’

Qualche idea sul perché questo accade su IE?

Se ti aspetti che tu sia globale, puoi semplicemente eliminare la linea var y nel tuo secondo file.

Il ragionamento alla base di questo è che dal momento che vuoi essere globale comunque, basta considerarlo come globale e già dichiarato. L’effetto collaterale di JavaScript di rendere globali le variabili dichiarate senza il prefisso var gioca a tuo favore in questa situazione. Testato su IE8, funziona perfettamente.

Edit: Per quanto riguarda il motivo per cui ciò accade, lo spiegherei semplicemente come un bug in una combinazione di gestione di globals di IE su file e sollevamento di dichiarazioni. In realtà, però, dovresti solo dichiarare qualsiasi variabile, ma soprattutto globale, in un unico posto. Il tuo problema può essere evitato seguendo questa regola empirica.

Caso di test semplificato:

   

E sì, questo è assolutamente un bug nel motore JScript di IE.

Perché succede? Perché IE fa una delle cose pazze che fa? Fai un rumore irritato, vai avanti, cerca di evitare di farlo …

Questo sta accadendo in IE perché la linea di ri-dichiarazione sta impostando y a indefinito. Quindi il test della linea se y non è impostato passa e y cambia in “nuovo”.

Cambia il secondo script in:

 //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