OK, cela me rend fou:
premier exemple, pas de problème: p> 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 Réponses :
à l'intérieur du deuxième exemple, dans votre deuxième script code> Block code>, Par conséquent, myvar code> 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. P>
var myvar code> (la définition hossitée interprétée) va conduire à
myvar code> étant
non défini code> lorsque l'alerte
() code> look up
myvar code> sur le variableObject . p>
@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 code> est initialisé deux fois (buggy). Parce que
myvar code> est initialisé dans le premier bloc et
si (faux) code> est un code inaccessible (non compilé) mais il alerte
myvar code> comme
non défini code>. Voir, pas de levage! "Hosting" défini dans le Article parle de la portée de la fonction et de la portée globale .
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 p>
Je suis pour le hisser, comme l'a dit Alex. Le compilateur voit que vous définissez myvar code> dans votre bloc (
var mouthvar code> intérieure
si code>) et heister le connu précédemment connu code> myvar code> . Je ne suis pas sûr que ce soit un bogue ou une fonctionnalité, cependant. P>
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:
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
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) P>
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 p>
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 )!
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 code> s définition est hissé et ombragée la propriété de la fenêtre code>.
@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) {} code> bloc, car je ne l'ai pas ajouté dans le code ci-dessus. Ad @ m