2010-02-10 24 views
12

estoy comprobando si se define o no una variable, y si no se define explícitamente Voy a definirla haciendo:'variable' se utilizó antes de que se definió

if (typeof(aVariable) == 'undefined') { 
    var aVariable = value; 
} 

Debido a que la variable es no definido JSLint advierte que se usa antes de que se defina, y eso es exactamente lo que quiero.

¿Cómo puedo superar esto?

quiero para permitir la definición de las variables que hacen esto explícitamente:

<script> 
    var aVariable = value; 
</script> 
<script src="myScript.js"></script> 

Así que todos los que se va a incluir este script puede personalizar algunas de las propiedades. Y me temo que no puedo cambiar esta lógica porque ya se está utilizando en cientos de sitios web de esta manera.

Desplácese hacia abajo para las respuestas/soluciones, porque he respondido a mi propia pregunta Stack Overflow no aparece. Asegúrate de no extrañarlos.

Respuesta

5

I encontró respuestas más aceptables en la lista de correo JSLint, perdón por eso Boldewyn :)

Solución 1

En IE, a nivel de script (es decir por archivo, o por bloque de script), si ve una declaración "var" de durante su fase de análisis (antes de la ejecución), restablecerá el valor de esa variable si ya existía.

Así que mejor sería simplemente hacer esto:

/*global foo: true */ 
if (typeof foo === "undefined") { 
foo = "some value"; 
} 

Por no declarar "var" y simplemente asignar foo, foo obtendrá automáticamente ámbito global.

Solución 2 (caso especial)

Si se establece explícitamente la variable no es cero o falsa

var foo = foo || "some value"; 
+0

¿Hay una penalización de rendimiento para la solución 2? O cualquier efecto secundario? ¿Supongo que no podría cambiar el foo global? – Vanuan

+0

La Solución 2 parece tener un efecto secundario: la página se colgó poco después de la carga en Safari (en iOS 6.1.3) cuando un archivo JS tenía la fila 'var window = window || {}; '. Chromium (en Ubuntu 12.04) no tuvo tal problema. Extraño. –

7

Creo que lo que JSLint le está diciendo es que no debe usar variables antes de que se definan. Si está satisfecho de que sea apropiado en su escenario, puede ignorar esa advertencia. Si no está absolutamente seguro, piense por qué esta variable aún no está definida.

Por ejemplo, ¿realmente desea probar si aVariable tiene un valor establecido, en lugar de estar o no definido?

var aVariable = null; 

... (en algún momento más adelante)

if (aVariable == null) { 
    aVariable = value; 
} 
2

Prueba esto:

aVariable = null; 

aVariable = typeof(aVariable) == 'undefined' ? null : value; 
-1

Ese error parece ser desencadenado cuando se utiliza camello carcasa para su nombre de la variable. Si comienza la variable con una letra mayúscula (Variable) o la hace minúscula (variable), obtiene el error "global implícito".

No estoy seguro de lo que está tratando de sugerir al aplicar la carcasa en su nombre de variable, aunque siempre tiene que tomar JSLint con un grano de sal. Lo que estás haciendo aquí es perfectamente válido y una buena práctica para evitar el uso accidental de variables indefinidas.

+0

Pregunta: * JSLint advierte que se utiliza antes de que se define *. ¿Cómo está eso relacionado con el caso de camello? Y * no * es perfectamente válido, porque JSLint tiene razón: la variable * se * usa antes de definirse. – Boldewyn

+1

Lea mi respuesta más a fondo antes de votar. Está relacionado con la carcasa del nombre de variable que el OP utilizó: 'aVariable'. Ejecute el mismo código publicado en la pregunta con el nombre de la variable escrito como 'avariable',' AVARIABLE', o 'Avaryable' y notará que JSLint ya no muestra el error. –

+0

Entonces, ¿qué JSLint usas? El que está en http://www.jslint.com/ da el mismo resultado independientemente de la ortografía porque * no tiene nada que ver con la ortografía *. – Boldewyn

4

Se podría hacer que la variable (que es mundial de todos modos) un miembro explícito de window:

window.aVariable = 'default'; 

y más tarde

if (! ('aVariable' in window)) { 
    window.aVariable = 'new value'; 
} 

Si usted no quiere o no puede cambiar el código, entonces yo Sugeriría el ansatz pragmático e ignoraría las quejas de JSLint, ya que su código funcionará de todos modos (es decir, siempre que no active el modo estricto de ECMAScript 5 ...).

1

más fácil de declarar las variables antes de hacer cualquier uso de ellos:

var aVariable; 

Este será inicializado con el tipo de "indefinido", por lo que la prueba no definido todavía funcionará:

if (typeof aVariable == "undefined") { 
    aVariable = value; 
} 
Cuestiones relacionadas