6
votes

Avez-vous déjà vu cet étrange iee comportement / bug JavaScript?

OK, cela me rend fou:

premier exemple, pas de problème: p> xxx pré>

maintenant, avec deux éléments de script: P>

<script>

window.myvar = 150;

</script>

<script>

if (false) {
  var myvar = 3;
}

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

</script>


5 commentaires

Pouvez-vous vérifier si le code de tinypaste.com/49c80 montre la même erreur que ci-dessus, afin que je puisse répondre ta question? Je ne peux pas tester parce que je n'utilise pas ma boîte à vitres pour le moment. Ad @ m


J'aurais aimé avoir l'IE8 à tester maintenant. On dirait que myvar s définition est hissé et ombragée la propriété de la fenêtre .


@Adam Ce code teste OK dans IE7 / 8, il alerte 100


Adam, Nope. Cela n'exploit pas le bogue / la fonctionnalité.


Je vois ... Donc, il doit être quelque chose à voir avec le si (faux) {} bloc, car je ne l'ai pas ajouté dans le code ci-dessus. Ad @ m


5 Réponses :


3
votes

à l'intérieur du deuxième exemple, dans votre deuxième script Block , myvar a été hosté (selon la spécification) au sommet de la portée contenant. N'oubliez pas que JavaScript n'a pas de portée bloquante, seule la portée de la fonction.

Par conséquent, var myvar (la définition hossitée interprétée) va conduire à myvar étant non défini lorsque l'alerte () look up myvar sur le variableObject .


3 commentaires

@sushil j'ai ajouté un lien qui explique utilement le levage de manière plus détaillée.


Merci, maintenant c'est clair. Je ne sais pas pourquoi ça marche différemment sur un autre navigateur si


@alex je ne vois pas de levage. C'est un bug IE8. IE8 semble compiler des blocs de script séparément. Ainsi, myvar est initialisé deux fois (buggy). Parce que myvar est initialisé dans le premier bloc et si (faux) est un code inaccessible (non compilé) mais il alerte myvar comme non défini . Voir, pas de levage! "Hosting" défini dans le Article parle de la portée de la fonction et de la portée globale .



0
votes

Cela ne m'arrive pas dans IOS Safari sur 4.3.1, il pourrait donc s'agir d'un bogue dans IE. Cependant, la réponse de Alex peut également être vraie aussi. Ad @ m


0 commentaires

0
votes

Je suis pour le hisser, comme l'a dit Alex. Le compilateur voit que vous définissez myvar dans votre bloc ( var mouthvar intérieure si ) et heister le connu précédemment connu myvar . Je ne suis pas sûr que ce soit un bogue ou une fonctionnalité, cependant.


0 commentaires

3
votes

C'est parce que JavaScript est-il en fonction de la portée basée sur les niveaux de fonction, votre code calcule / compile / équivalent aux éléments suivants: xxx


2 commentaires

OK, cela a donc quelque chose à voir avec la levée variable. Semble seulement sur IE, cependant.


Exemple JSBIN: JSBIN.com/upexat/6/edit#Source et une autre version < Un href = "http://jsbin.com/upexat/8/edit#source" rel = "Nofollow Noreferrer"> JSBIN.com/upexat/8/edit#Source



2
votes

Il y a un peu plus aussi que Alex dit (même s'il vient de référencer mon article - merci!).

Si la séquence de code était dans la séquence qu'il apparaît, "Var Myvar" ne serait pas hué (ou plutôt Son levage n'aurait aucun effet) parce que "window.myvar = 150" est défini en premier (de plus, cela n'expliquerait pas pourquoi le premier exemple a fonctionné et le second échoué seulement dans IE)

On dirait que le second script est (en quelque sorte) de chargement avant le premier - mais uniquement dans IE8 . Vous pouvez simuler la commutation de la séquence des tags et vous verrez une alerte non définie dans tous les navigateurs xxx


1 commentaires

Il n'y a pas de "hosting"! Ceci est juste un bug IE8. Bien écrit article à la manière (pour ceux qui venaient de c )!