Question

Lors de l'exécution du bloc de code suivant, FF et Chrome sortie typeof(hiya) = string tandis que IE7 / 8 typeof(hiya) = undefined de sortie.

<html>
    <body>
        <script type="text/javascript">
            window.hiya = 'hiya';
        </script>
        <script type="text/javascript">
            if( false ) {
                var hiya = 1;
            }
            document.write( "typeof(hiya) = "+ typeof(hiya) );
        </script>
    </body>
</html>

Chacune des marques suivantes disparaître le problème:

  • La combinaison tout en un seul bloc <script>.
  • Retrait du bloc if.
  • Modification du nom var hiya = 1 à var hiya2 = 1.
  • Modification du nom var hiya = 1 à window.hiya = 1.
  • Modification du nom var hiya = 1 à hiya = 1.

Qu'est-ce qui se passe? Y at-il un bug de cadrage dans IE?

Était-ce utile?

La solution

IE est muet, il ne reconnaît pas que l'accès window.varName et var varName la même variable dans certains cas.

Quand une nouvelle balise de script est rencontré, il initialise d'abord toutes les variables déclarées avec var. Il ne fonctionne pas l'instruction var (la partie qui l'initialiser à « hiya »). Initialisées juste undefined. Il ne le fera pas si elle a déjà été déclarée avec var bien.

Si votre code est en une seule balise de script, cette erreur ne se produirait pas. En outre, si la première déclaration de hiya a été fait avec var, cette erreur aussi ne se produirait pas.

Plus précisément, dans votre deuxième balise de script, IE recherche d'abord des déclarations var, elle trouve un var var hiya = 1; Ensuite, il dit: hiya n'a pas été initialisé avec des instructions var précédemment (IE étant muet, les autres navigateurs reconnaissent que window.hiya fait la même chose) et hiya initialise, avant d'exécuter window.hiya d'écraser un code.

Solutions possibles:

  • Gardez votre code dans la même balise script
  • Ne pas initialiser les variables avec window.hiYa
  • Si vous ne contrôlez pas sur l'un des scripts, assurez-vous que le script qui utilise var vient en premier

Dernière note de clarifier ce que JS parseurs faire à votre code. Lorsque l'analyseur JS voit votre code, il se transforme dans les éléments suivants:

<html>
    <body>
        <script type="text/javascript">
            window.hiya = 'hiya';
        </script>
        <script type="text/javascript">
            // IE is dumb, it doesn't recognize that hiya is already 
            // defined as window.hiya, so it's initialized to undefined here
            var hiya;
            if( false ) {
                hiya = 1;
            }
            document.write( "typeof(hiya) = "+ typeof(hiya) );
        </script>
    </body>
</html>

Donc, si vous mettez tout en une seule balise script, c'est ce que le code serait (après que le moteur JS déplacé les déclarations var vers le haut), de sorte que vous pouvez voir qu'il n'y a aucun moyen l'IE pourrait gâcher, depuis votre affectation window.hiya serait après le var qui a été déplacé vers le haut.

<html>
    <body>
        <script type="text/javascript">
            var hiya;
            window.hiya = 'hiya';
            if( false ) {
                hiya = 1;
            }
            document.write( "typeof(hiya) = "+ typeof(hiya) );
        </script>
    </body>
</html>

Autres conseils

peut être vu La question principale ici http://jsfiddle.net/Raynos/UxrVQ/ Je n'ai pas encore savoir pourquoi IE window.hiya sans vérifier écrase.

[Modifier]

De la spécification. Page 38:

  

Pour chaque VariableDeclaration ou   VariableDeclarationNoIn dans le code,   créer une propriété de la variable   objet dont le nom est l'identificateur dans   le VariableDeclaration ou   VariableDeclarationNoIn, dont la valeur   est indéfinie et dont les attributs sont   déterminé par le type de code. Si   il y a déjà une propriété de la   objet variable avec le nom d'une   variable déclarée, la valeur de la   la propriété et ses attributs ne sont pas   changé.

Une explication possible pourrait être que dans le contexte global IE établit une distinction entre l'objet et la window variable object pour une portée globale lors de la déclaration des variables. une propriété mise en alternative sur l'objet window directement pourrait ne pas mettre la même propriété sur l'objet variable. Si vous pouvez trouver une spécification formelle JScript ou avoir la source de IE qui traînent alors nous pouvons trouver exactement ce que le bizarrerie est.

[/ Modifier]

Merci à @TimDown & @JuanMendes soulignant que est une question de savoir si l'écriture d'une propriété à l'objet de la fenêtre est une déclaration variable.

Le problème:

Déclaration de variable est déplacé vers le haut du bloc. Même si le code est mort. Dans IE pour une raison quelconque il hiya déclarer une variable locale, même si elle les classes avec la propriété du même nom enregistré dans la fenêtre.

Explication:

Qu'est-ce qui se passe est que votre déclaration d'une variable appelée hiya. L'instruction var est automatiquement supprimé au sommet du bloc. Une instruction if est pas un bloc, une fonction est. Donc, événement si le code ne soit lancé dans le bloc la variable obtient toujours déclarée.

Dans Firefox, il va reconnaître que window.hiya est une déclaration de hiya.

Dans IE la déclaration dans le second script écrase

Qu'est-ce qu'il fait actaully

Dans Firefox:

// script block 1
var hiya; // window.hiya counts as a declaration
window.hiya = "hiya"; // set

// script block 2
if (false) hiya = 1;
document.write(...)

Dans IE:

// script block 1
window.hiya = "hiya";

// script block 2
var hiya; // redeclared here because window.hiya "isn't" a declaration
if (false) hiya = 1; 
document.write(...)

La solution est tout simplement l'espace de nommage. Vous utilisez le même nom en deux endroits et l'accès en deux noms différents. Soit utiliser des noms différents ou utiliser des fermetures pour donner une portée locale.

Qu'est-ce que vous rencontrez est dû à:

  1. var étant une déclaration
  2. Il n'y a pas de champ bloc JS
  3. Des déclarations sont exécutées avant que le code fonctionne

Alors qu'est-ce qui se passe est que JavaScript va exécuter l'instruction var avant avant toute autre chose, mais il ne va pas évaluer l'expression d'affectation, à cet effet hiya par défaut à la valeur de undefined.

Comme déjà indiqué Raynos IE exécutera chaque script lui-même, donc le comportement décrit ci-dessus, sera dans les résultats hiya étant non définie.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top