Pour effectivement répondre à votre question de savoir POURQUOI ce qui se passe-c'est seulement un peu plus de deux ans et un mois :D -- , c'est à cause de la variable de levage.
Fondamentalement, il y a une phase avant l'exécution de code dans la portée globale ou à l'intérieur d'une fonction où le code est scanné pour tous var
et function
des déclarations (à ne pas confondre avec la fonction d'expressions, mais c'est une autre histoire).
Toutes ces variables et les fonctions sont alors déclarés à l'intérieur du périmètre actuel, et ensuite seulement, le code exécuté.
Cela se produit indépendamment de leur position dans le code, avec des étendues correspondant à la fonction des organes, pas de blocs d'instructions. Et ce qui rend cette situation encore plus contre-intuitif, même si vous définissez une valeur initiale des variables dans leurs déclarations, ils vont rester encore "vide" jusqu'à ce que la déclaration est atteint de nouveau dans le flux d'exécution normale.
Donc, lorsque vous écrivez:
if(!embed_BackgroundColor) {
var embed_BackgroundColor;
embed_BackgroundColor = "#F4F4F4";
}
ce qui se passe réellement est ceci:
Code est scanné pour var
des déclarations. embed_BackgroundColor
est déclarée à l'intérieur de ce champ d'application, indépendamment de savoir si elle a déjà été déclarée ou non. Sa valeur initiale est indéfini.
L'exécution du code commence. L' if
exécution de l'instruction. La variable est déclarée, mais sa valeur n'est pas définie, de sorte que la condition est vraie. À l'aide de typeof
ne serait pas vous aider à distinguer ici entre un non déclaré et a déclaré-mais-pas-encore-ensemble de variables. Il ne fait aucune différence de toute façon.
L' var
déclaration est atteint par le flux normal du code. Si vous avait donné à la variable une valeur initiale, il aurait été réglé aujourd'hui. Dans ce cas, rien ne se passe.
embed_BackgroundColor
à la valeur "#F4F4F4"
.
Ainsi, la ligne de fond est la suivante: vous pouvez utiliser typeof variable == 'undefined'
comme on le voit dans les autres réponses, ou même simplement"!la variable " comme il vous a été initialement à l'aide, mais ne pas utiliser var
ou, ce qui gâcherait tout.