Para responder realmente a su pregunta de POR QUÉ esto está sucediendo, solo han pasado un poco más de dos años y un mes: D, es por variable hoisting.
Básicamente, hay una fase antes de ejecutar código en el ámbito global o dentro de una función donde el código es escaneado para todos los var
y function
declaraciones (que no debe confundirse con la función expresiones, pero eso es otra historia).
Todas estas variables y funciones se declaran dentro del alcance actual, y solo después ejecuta realmente el código.
Esto ocurre independientemente de su posición en el código, con ámbitos correspondientes a cuerpos de funciones, no bloques de instrucciones. Y lo que lo hace aún más contra-intuitivo, incluso si establece un valor inicial para las variables en sus declaraciones, they will still remain "empty" until the declaration is reached again in normal execution flow.
Así que cuando se escribe:
if(!embed_BackgroundColor) {
var embed_BackgroundColor;
embed_BackgroundColor = "#F4F4F4";
}
lo que en realidad sucede es lo siguiente:
Código se analizan en busca de declaraciones var
. embed_BackgroundColor
se declara dentro de este alcance, independientemente de si ya fue declarado o no. Su valor inicial no está definido.
Comienza la ejecución del código. Se ejecuta la instrucción if
. La variable es declarada, pero su valor no está definido, por lo que la condición es verdadera. Usar typeof
no lo ayudaría a distinguir aquí entre una variable no declarada y una declarada pero no establecida aún. No hace ninguna diferencia de todos modos.
La declaración var
se alcanza por el flujo normal del código. Si le hubieras dado a la variable un valor inicial, se habría establecido ahora. En este caso, no pasa nada.
embed_BackgroundColor
se establece en el valor "#F4F4F4"
.
Así, la línea de fondo es: se puede usar typeof variable == 'undefined'
como se ve en las otras respuestas, o incluso claro como el que estaba utilizando al principio, pero no utiliza var
o que va a arruinar todo 'variable!'.
el problema es que no importa lo que la variable var = // "someValue" es sobrescribir el valor predefinido que existiera – johnnietheblack
es que en realidad, tres = s? (No sé) – jedierikb
No estoy seguro de por qué esto es aceptado. Parece usar el código anterior (con la variable 'var variable = "someValue"; 'la línea sin comentario da como resultado' variable' siempre siendo igual a "algúnValor" incluso si ya estaba definido. –