10
votes

La variable globale mondiale de JavaScript redéclamé remplace la valeur ancienne dans IE

(Création d'une question séparée après des commentaires sur ceci: JavaScript redéclairé global remplacement Vue ancienne )

Je crée une variable scopée globalement à l'aide de la notation du support carré et l'affectant une valeur à l'intérieur d'un fichier JS externe.

dans un autre fichier JS, je déclare un Var avec le même nom que celui que je viens de créer ci-dessus. Remarque Je ne cédant pas de valeur. Comme il s'agit d'une redéclaration de la même variable, l'ancienne valeur ne devrait pas être remplacée comme décrit ici: http: //www.w3schools.com/js/js_variables.asp

Créez 2 fichiers JavaScript avec le contenu suivant: Script1 xxx

script2 xxx

inclure ces 2 fichiers dans votre fichier HTML xxx

Ouvrir cette page dans Firefox and Chrome Alertes 'Old' qui est le comportement attendu. Toutefois, dans IE 8, la page va réellement alerter «Nouveau»

Toutes idées sur la raison pour laquelle cela se produit sur IE?


3 commentaires

Que se passe-t-il si vous mettez tout le code en ligne dans le fichier HTML? Cela donne le même résultat (vieux) pour moi dans Firefox 3.5.8, Chrome 5.0.342.7 et Konqueror 4.3.5. Les résultats pour d'autres navigateurs seraient utiles.


Si vous mettez tout le code dans un fichier, le hisser aurait lieu et le problème ne serait probablement pas présent.


Oui si vous mettez tout le code dans une alerte à une seule place indique "Old" sur tous les navigateurs


3 Réponses :


4
votes

Si vous vous attendez à Y Pour être global, vous pouvez simplement déposer la ligne var y dans votre deuxième fichier.

Le raisonnement derrière c'est que puisque vous voulez y pour être global de toute façon, traitez-le comme celui d'une mondiale et déjà déclarée. Effet secondaire de Javascript de la fabrication de variables globales lorsqu'il est déclaré sans le préfixe var à votre faveur dans cette situation. Testé dans IE8, cela fonctionne simplement bien.

Edit: pourquoi cela se produit, je craquerais qu'il s'agisse d'un bogue dans une combinaison de la manipulation de Globaux d'IE à travers des fichiers et des déclarations. Vraiment, cependant, vous ne devriez déclarer que toute variable, mais surtout un global, au même endroit. Votre problème peut être évité en suivant cette règle de la règle.


5 commentaires

Merci pour cette suggestion. Logique. Bien qu'il soit toujours intéressant de savoir pourquoi cela ne se comporte pas correctement dans IE.


Étonnamment, il semble que c'est-à-dire d'avoir un bogue dans sa mise en œuvre de JavaScript.


Oui, idéalement, nous voudrions déclarer une mondiale en un seul endroit. Mon cas d'utilisation était que j'avais plusieurs fichiers JS chacun de ceux qui déclaraient une classe de pépins de noms à l'aide de ce modèle: Script1: si (! A) a = {}; A.B = fonction () {....}; Script2 si (! A) a = {}; A.C = fonction () {....}; Maintenant, cela fonctionne bien jusqu'à ce que le premier script utilise la fenêtre.A ou fenêtre ['A'] pour déclarer A, puis c.-à-d. Casser. Étant donné que plusieurs pages peuvent choisir quels fichiers pour inclure chacun d'entre eux doivent vérifier si une existence.


Je ai pensé autant. Ceci est similaire à dojo.declare . Vous voudrez peut-être jeter un oeil pour voir comment ils l'ont fait ou peut-être même simplement utiliser Dojo: api.dojotoolkit.org/jsdoc/1.3/dojo.declare


Jusqu'à présent, ce bogue est arrivé parce que j'avais mon propre widget de dojo personnalisé ainsi que ma propre classe en utilisant le même préfixe des espaces de noms. Pour par exemple. A.MYDOJOWIDGET (widget dojo) suivi de A.MYCLASS (simple classe JS) Le problème est que dojo.declare déclare la classe de cette mode: fenêtre ['A'] = {}, puis a ['mydojowidget'] = .. J'ai évité ce problème (basé sur votre suggestion) en ne faisant pas var a.



1
votes

Ceci se produit dans IE, car la ligne de ré-déclaration est la définition y code> à indéfinie. Ensuite, le test de ligne si y code> n'est pas défini de passe et y code> modifications sur "Nouveau".

Modifiez le deuxième script à: P>

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


3 commentaires

Droit je comprends ça. Mais si vous deviez fusionner le contenu des 2 fichiers dans un seul endroit où vous ne seriez plus indéfini et la redéclaration ne serait pas définie y à indéfini. En conséquence, l'alerte montrerait «vieux»


Dans IE, toutes les déclarations sont exécutées avant d'autres parties du code. Dans la seconde, citons si vous faites une alerte de première ligne (fenêtre ['Y']), vous verrez que la valeur est indéfinie. Si vous commencez la ligne de redéclaration, vous verrez l'apparition «ancienne» attendue.


En fait, cela se produit dans tous les navigateurs et s'appelle huisting ; Cependant, il semble que c'est-à-dire que c'est de le faire mal dans ce scénario et de provoquer une écrasement.



10
votes

Cas de test simplifié: xxx

et oui, ceci est absolument un bogue dans le moteur JScript de IE.

Pourquoi est-ce que cela se passe-t-il? Pourquoi c'est-à-dire l'une des choses folles qu'elle fait? Faites un bruit irrité, passez à autre chose, essayez d'éviter de faire cela ...


1 commentaires

Si vous avez réduit le "quelque chose de mal avec toi" et "quelque chose qui ne va pas avec IE", allez avec c'est à chaque fois ...