je me sens comme si j'essayais de faire quelque chose de super simple, mais juste d'être stupide à ce sujet.
tout ce que je veux faire est de voir si une variable a été définie précédemment, et si elle n’a PAS été définie, définissez-la avec une valeur par défaut .... en voici un exemple:
if(!embed_BackgroundColor) {
var embed_BackgroundColor;
embed_BackgroundColor = "#F4F4F4";
}
alors, une fois que vous arrêtez de rire de mon code ... POURQUOI écrase-t-il la variable, quoi qu'il arrive?
s'il te plaît sauve mes nerfs;)
if (typeof variable === 'undefined') {
// variable is undefined
// eg:
// var variable = "someValue";
}
Style pro:
var SomeVar = SomeVar || 'Default Value';
Ce serait une bonne pratique de codage dans ce cas d'utiliser l'opérateur ternaire. De plus, vous n'avez pas besoin d'avoir trois signes égaux pour comparer avec typeof. C'est la solution la plus concise:
b = typeof(b) == 'undefined' ? 0 : b;
Cela, espérons-le, vous fera gagner du temps.
Pour répondre réellement à votre question de savoir pourquoi cela se produit - cela ne fait qu'un peu plus de deux ans et un mois: D -, c'est à cause de levage variable .
Fondamentalement, il y a une phase avant l'exécution du code dans la portée globale ou à l'intérieur d'une fonction où le code est analysé pour toutes les déclarations var
et function
(à ne pas confondre avec la fonction expressions, mais c'est une histoire différente).
Toutes ces variables et fonctions sont ensuite déclarées dans la portée actuelle et seulement après le code est réellement exécuté.
Cela se produit quelle que soit leur position dans le code, les étendues correspondant aux corps de fonction et non à des blocs d'instructions. Et ce qui rend cela encore plus contre-intuitif, même si vous définissez une valeur initiale pour les variables dans leurs déclarations, elles resteront toujours "vides" jusqu'à ce que la déclaration soit à nouveau atteinte dans le flux d'exécution normal .
Alors quand tu écris:
if(!embed_BackgroundColor) {
var embed_BackgroundColor;
embed_BackgroundColor = "#F4F4F4";
}
ce qui se passe réellement est la suivante:
Le code est scanné pour les déclarations var
. embed_BackgroundColor
est déclaré dans cette étendue, qu'il ait déjà été déclaré ou non. Sa valeur initiale est indéfinie.
L'exécution du code commence. L'instruction if
est exécutée. La variable est déclarée, mais comme sa valeur est indéfinie, la condition est vraie. Utiliser typeof
ne vous aiderait pas à distinguer ici entre une variable non déclarée et une variable déclarée mais non encore définie. Cela ne fait aucune différence de toute façon.
La déclaration var
est atteinte par le flux normal du code. Si vous aviez donné à la variable une valeur initiale, elle aurait été définie maintenant. Dans ce cas, rien ne se passe.
embed_BackgroundColor
est défini sur la valeur "#F4F4F4"
.
En résumé, vous pouvez utiliser typeof variable == 'undefined'
comme indiqué dans les autres réponses, ou même simplement '! Variable' tel que vous l'utilisiez initialement, mais n'utilisez pas var
ou cela ruinerait tout.
Je préfère cette syntaxe:
embed_BackgroundColor = embed_BackgroundColor || "#F4F4F4"
Ne peut pas être beaucoup plus simple que ça! Et cela semble fonctionner même si cela a été modifié.
Si c'est une variable globale, j'aime bien faire:
var defineMe = window.defineMe || 'I will define you now';
Il est important d'utiliser l'espace de noms de la fenêtre, car la référence à des variables non définies provoquera de très mauvaises erreurs, mais pas les propriétés non définies.
Si embed_BackgroundColor est un paramètre d’une fonction qui n’a pas été transmise, vous pouvez définir une valeur par défaut avec
embed_BackgroundColor ? embedBackgroundColor : embed_BackgroundColor = "#F4F4F4";
Exemple de fonction complète
function colorFunctionThing(embed_BackgroundColor) {
embed_BackgroundColor ? embed_BackgroundColor : embed_BackgroundColor = "#F4F4F4";
console.log(embed_BackgroundColor);
};
colorFunctionThing();
Les sorties
#F4F4F4
Ce n’est pas exactement ce que vous cherchiez, mais vous avez toujours bon à savoir.
Je suis le blog de Chris West et j'ai constaté qu'il avait posté un moyen plutôt cool sur http://gotochriswest.com/blog/2012/07/02/javascript-define-if-undefined/ - .
En gros, vous avez la définition de la fonction define
et vous l'utilisez ensuite comme ceci:
define("embed_BackgroundColor", "#F4F4F4");
Le code ci-dessus définira enbed_BackgroundColor dans le contexte global s'il n'est pas déjà défini. L'exemple que Chris a utilisé est un peu plus utile et se présente comme suit:
alert("jStuff is " + (typeof jStuff == "undefined" ? "un" : "") + "defined.");
define("jStuff.alert", function(msg) {
alert(msg);
return msg;
});
alert("jStuff is " + (typeof jStuff == "undefined" ? "un" : "") + "defined.");
var str = jStuff.alert("Show and save this message.");
str
.Je pense que votre code posté devrait fonctionner. Sauf si votre valeur d'origine est 0.
Le problème est ailleurs.
Je suppose que vous avez défini 'embed_BackgroundColor' hors de la portée de votre code. Et lorsque vous exécutez votre code, cette variable est indéfinie dans l'étendue de votre code et se voit attribuer la valeur par défaut.
Voici un exemple:
var embed_BackgroundColor = "#FF0000";
(function(){
if(!embed_BackgroundColor) {
var embed_BackgroundColor;
embed_BackgroundColor = "#F4F4F4";
}
alert(embed_BackgroundColor); // will give you #F4F4F4
})();
alert(embed_BackgroundColor); // will give you #FF0000;
Je préfère une solution générale de style PHP:
function isset(x)
{ return typeof(x)!='undefined'; }
Meilleure option:
if (typeof someVar === 'undefined') someVar = someValue;
Parce que votre bloc if
sera exécuté si embed_BackgroundColor
est false
, 0
, ""
, null
, undefined
ou NaN
.
Mais embed_BackgroundColor
ne doit pas être écrasé s'il a déjà été affecté à une autre chaîne non vide ... Ou du moins, ce n'est pas mon cas.
Peut-être s'agit-il d'un cas de conflit, comme l'a souligné Aaron Qian.