www whatwg what spec language español 3wc javascript variables

javascript - spec - whatwg español



javascript: define una variable si no existe (12)

Siento que estoy tratando de hacer algo súper simple, pero solo ser estúpido al respecto.

todo lo que quiero hacer es ver si una variable se ha establecido previamente, y si NO, configurarlo con un valor predeterminado ... aquí hay una muestra:

if(!embed_BackgroundColor) { var embed_BackgroundColor; embed_BackgroundColor = "#F4F4F4"; }

Entonces, una vez que dejas de reírte de mi código ... ¿POR QUÉ está sobreescribiendo la variable sin importar qué?

por favor salva mis nervios;)


Creo que tu código publicado debería funcionar. A menos que su valor original sea 0.

El problema está en otro lado.

Supongo que definiste ''embed_BackgroundColor'' fuera del alcance de tu código. Y cuando ejecuta su código, esa variable no está definida en el alcance de su código, y se le asignará el valor predeterminado.

Aquí hay un ejemplo:

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;


Debido a que su bloque if se ejecutará si embed_BackgroundColor es false , 0 , "" , null , undefined o NaN .

Pero embed_BackgroundColor no se debe sobrescribir si ya se ha asignado a otra cadena no vacía ... O al menos, no está en mi extremo.

Tal vez sea un caso de ámbitos contradictorios, como ha señalado Aaron Qian.


Estilo Pro:

var SomeVar = SomeVar || ''Default Value'';


Mejor opción:

if (typeof someVar === ''undefined'') someVar = someValue;


Para responder realmente a su pregunta de POR QUÉ está sucediendo esto, solo han pasado un poco más de dos años y un mes: D, es debido a la elevación variable .

Básicamente, hay una fase antes de ejecutar el código en el ámbito global o dentro de una función donde se escanea el código para todas las declaraciones de function y var (que no debe confundirse con expresiones de funciones, pero esa es una historia diferente).
Todas estas variables y funciones se declaran dentro del alcance actual, y solo después se ejecuta realmente el código.

Esto sucede independientemente de su posición en el código, con ámbitos correspondientes a cuerpos de funciones, no bloques de instrucciones. Y lo que hace que esto sea aún más contrario a la intuición, incluso si establece un valor inicial para las variables en sus declaraciones, seguirán siendo "vacías" hasta que se llegue a la declaración nuevamente en el flujo de ejecución normal .

Entonces cuando escribes:

if(!embed_BackgroundColor) { var embed_BackgroundColor; embed_BackgroundColor = "#F4F4F4"; }

lo que realmente sucede es esto:

  1. El código se analiza 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.

  2. La ejecución del código comienza. La sentencia if se ejecuta. La variable se declara, 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.

  3. 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.

  4. embed_BackgroundColor se establece en el valor "#F4F4F4" .

Entonces, la línea de fondo es: puedes usar typeof variable == ''undefined'' como se ve en las otras respuestas, o incluso simple ''! Variable'' como lo estabas usando inicialmente, pero no uses var o eso arruinará todo.


Prefiero esta sintaxis:

embed_BackgroundColor = embed_BackgroundColor || "#F4F4F4"

No puede ser mucho más simple que eso! Y parece funcionar incluso si ha sido variado.


Prefiero una solución general en estilo PHP-like:

function isset(x) { return typeof(x)!=''undefined''; }


Sería una buena práctica de codificación en este caso usar el operador ternario. Además, no necesita tener tres signos iguales al comparar con typeof. Esta es la solución más concisa:

b = typeof(b) == ''undefined'' ? 0 : b;

Espero que esto les ahorrará algo de tiempo.


Si embed_BackgroundColor es un parámetro en una función que no se aprobó, puede establecer un valor predeterminado con

embed_BackgroundColor ? embedBackgroundColor : embed_BackgroundColor = "#F4F4F4";

Ejemplo de función completa

function colorFunctionThing(embed_BackgroundColor) { embed_BackgroundColor ? embed_BackgroundColor : embed_BackgroundColor = "#F4F4F4"; console.log(embed_BackgroundColor); }; colorFunctionThing();

Salidas

#F4F4F4

No es exactamente lo que estabas buscando, pero aún así es muy bueno saberlo.


Si es una variable global, me gusta hacer:

var defineMe = window.defineMe || ''I will define you now'';

Es importante utilizar el espacio de nombres de la ventana, ya que al hacer referencia a las variables no definidas se producirán errores muy graves, pero no así las referencias a las propiedades no definidas.


Sigo el blog de Chris West y vi que publicó una buena manera en http://gotochriswest.com/blog/2012/07/02/javascript-define-if-undefined/ .

Básicamente, tiene la definición para la función de define y luego la usa así:

define("embed_BackgroundColor", "#F4F4F4");

El código anterior definirá enbed_BackgroundColor en el contexto global si aún no está definido. El ejemplo que Chris usó es un poco más útil y es el siguiente:

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.");

  • Aparecerá la primera declaración de alerta, "jStuff no está definido".
  • Aparecerá la segunda declaración de alerta, "jStuff está definido".
  • La declaración de alerta final mostrará la alerta especificada y luego esa cadena se almacenará en la variable str .

if (typeof variable === ''undefined'') { // variable is undefined // eg: // var variable = "someValue"; }