2010-03-20 16 views
26
function test(){ 
    if(true){ 
     var a = 5; 
    } 
    alert(a); 
} 

test(); 

me siguen dando 'fuera de alcance' errores en mi código JS cuando compruebo con JSLint cuales no tienen sentido para me.So creé rápidamente un ejemplo. ¿Hay algo realmente malo con esta pieza de código, ya que la variable finalmente se eleva a la parte superior de la función de todos modos.JSLint error

+0

por lo que es más una advertencia. – Rajat

+2

Muchos de los "errores" de JSLint son solo advertencias en el sentido de que no son errores de lenguaje JavaScript y no necesariamente fallarán en el tiempo de ejecución. Se llaman errores porque Douglas Crockford los considera una mala práctica. –

Respuesta

34

Mientras que var localiza una variable a la función y está sujeta a elevación, la mayoría de los lenguajes tienen alcance de bloque y no alcance de función.

Al usar la palabra clave var dentro de un bloque if, pero al acceder a la variable fuera de ese bloque, ha creado una construcción que puede ser confusa para las personas que no están familiarizadas con esa idiosincrasia JS.

Douglas Crockford recommends usando una sola declaración var en la parte superior de una función que especifica todas las variables que deben tener un ámbito para esa función.

function test(){ 
    var a; 
    if(true){ 
     a = 5; 
    } 
    alert(a); 
} 

test(); 

Con múltiples variables que tendría:

function foo() { 
    var a, b, c, d = "only d has an initial value", e; 
    // … 
} 
+14

Douglas Crockford recomienda * muchas * cosas ... como con cualquier herramienta, siempre debe tomarse en serio las recomendaciones de JSLint y adaptarlas a usted/a su equipo. Si todos en su equipo entienden cómo funciona el alcance variable de JS, de todos modos debe ignorar las recomendaciones de Crockford sobre dónde colocar sus declaraciones "var"). – machineghost

5

El código que ha escrito está trabajando. Simplemente no es muy legible/mantenible. La declaración de la variable a dentro del alcance de la if puede dar la falsa impresión de que a sólo es visible dentro de este ámbito de aplicación (que, como este programa muestra, no es cierto - a será visible a lo largo de toda la función).

Esta advertencia JSLint le anima a realizar la declaración en el alcance exacto en el que se utiliza realmente la variable, de la siguiente manera:

function test(){ 
    var a; 
    if(true){ 
     a = 5; 
    } 
    alert(a); 
} 
+0

Umm ... 'var = null' ?? – Quentin

+0

Es de suponer que es un error tipográfico y debería ser 'var a = null'. – eyelidlessness

+0

Gracias, lo arreglaron. –

1

Javascript tiene ámbito de la función y no bloquea alcance. Por lo tanto, las variables declaradas dentro si la función es visible y accesible fuera del bloque if y dentro de la función en la que se declara if.

compiladores en línea como JSLint y jsbin dan advertencias pero no son errores.

Cuestiones relacionadas