Le code est le suivant :
if(!("a" in window)){
var a = 1;
}
alert(a);
J'ai vu l'explication pertinente, la raison est que la déclaration des variables sera promue, mais l'affectation des variables ne sera pas promue, mais je ne la comprends toujours pas. Le code du bloc d'instruction if a-t-il été exécuté ? Si non, quelle instruction a provoqué la promotion de la variable ? S'il est exécuté, la valeur de a doit être 1.
J'ai essayé de saisir le code suivant dans la console
alert(b)//报错,b未被定义;
if (2>1){
var b=1;
}
alert(b)//1
if("a" dans la fenêtre)
var a = 1;
alert(a);
Question 1
Non exécuté
Question 2
La promotion variable n'est pas provoquée par des instructions, mais est réellement effectuée lorsque le moteur js compile votre code js !
Quel est le principe ?
Prenons Chrome comme exemple. Lorsque le premier moteur v8 rencontrera votre code, il deviendra comme ceci :
Ensuite, parce que a a été déclaré, !("a" dans la fenêtre) est toujours faux ! L'instruction à l'intérieur de if n'est pas exécutée !
Donc, quand alert(a), a n'a aucune valeur
J'ai utilisé votre code et le résultat était le popup 1
La déclaration de variable est mise à niveau vers le code suivant
Une fois la déclaration de variable mise à niveau, a est défini en premier, puis l'instruction if est entrée. a est un attribut de window Après avoir été inversé, il devient faux, donc le code de l'instruction if n'est pas exécuté, et la dernière. la chose qui apparaît est
undefined
var a;
if(!(a dans la fenêtre)){
}
alert(a);
si ce n'est pas vrai, bien sûr, le code à l'intérieur ne sera pas exécuté, il n'y a donc rien de mal à ce qu'il soit indéfini
Lorsque le moteur JavaScript analysera ce code, il sera analysé comme suit :
Parce que votre
a
a été déclaré comme propriété de window, donc la condition if est toujours fausse, et a n'est pas défini si aucune valeur ne lui est attribuée.