2009-05-01 16 views
63

JSLint (con la bandera OneVar encendido) está decayendo poco de código javascript que tengo con lo siguiente:¿Cuál es la razón detrás de JSLint diciendo que hay "demasiadas declaraciones var"

Problem at line 5 character 15: Too many var statements.

estoy feliz de corrija estos errores, pero me gustaría saber si lo estoy haciendo por rendimiento o porque es solo una mala práctica y tiene un gran potencial para introducir errores en mi código de JavaScript. ¿Cuál es la razón detrás de la bandera onevar?

Miré los documentos JSLint para el var keyword pero no habla específicamente sobre por qué varias instrucciones var en la misma función son malas.

Aquí hay un intento de ejemplo. Explicar cómo el código se beneficiará de tener sólo 1 comunicado var:

function Test(arg) { 
    var x = arg + 1, 
     y = cache.GetItem('xyz'); 
    if (y !== null) { 
     // This is what would cause the warning in JSLint 
     var request = ajaxPost(/* Parameters here */); 

    } 
} 
+0

¡Muéstranos guiones! – alex

Respuesta

99

Javascript no tiene campo de bloqueo. En otros idiomas (como c), si declaras una variable en la declaración if, no puedes acceder a ella fuera de ella, pero en javascript puedes. El autor de JSLint cree que es una mala práctica, ya que usted (u otros lectores) pueden confundirse y pensar que ya no puede acceder a la variable, pero en realidad sí puede. Por lo tanto, debe declarar todas sus variables en la parte superior de la función.

+0

Mejor respuesta que la mía, modding up. – tpdi

+7

Esto responde la parte de la pregunta de por qué uno debería declarar todos los 'VAR's en la parte superior de la función, pero ¿qué pasa con el punto con respecto a" una declaración 'VAR' vs varias declaraciones 'VAR' (todas en el parte superior)". ¿Hay una * buena * razón para esto, o simplemente una cosa que "ahorra escribir, entonces por qué no"? –

+0

las reglas predeterminadas de JSLint son solo representativas de la opinión de [david crockford] (http://www.jslint.com/help.html) sobre cómo hacer que el código correcto e incorrecto sea visualmente distinto. ¿Es su opinión una * buena * razón? no sé, pero es al menos * a * razón. – worc

1

Sólo una conjetura aquí, pero puede ser el momento para functional decomposition. Las funciones deben hacer una cosa y hacerlo bien.

Demasiados vars es sugestivo de una función que está tratando de hacer demasiado. O un caso donde deberías estar usando una matriz.

+0

No estoy seguro Estoy de acuerdo con esto. En este caso, "demasiados" es más de una var. Para evitarlo, puede usar comas, ('var x, y;') pero eso es difícil de leer. Esto es bastante ridículo, en mi opinión, y promueve el código difícil de leer. Actualmente estoy trabajando en un proyecto con mucho de esto, y es difícil ver dónde se declaran las variables. –

3

Si la opción "onevar" se establece en verdadero si solo se permite una sentencia var por función.

if (funct['(onevar)'] && option.onevar) { 
    warning("Too many var statements."); 
} 
+0

Bien, aclaré en la pregunta que específicamente entregué eso. Así que sé por qué me está advirtiendo, pero ¿qué hace para corregir ese código? – slolife

-6

La idea es que debe usar un objeto en lugar de vars individuales. Entonces, ¿dónde tienes:

var x = arg + 1, 
    y = cache.GetItem('xyz'); 

Cambiar a:

var dimensions = {}; 
dimensions.x = arg + 1; 
dimensons.y = cache.GetItem('xyz'); 
dimensions.request = ... 

A continuación, puede acceder a estas variables a través del objeto, su más ordenado para tener un objeto por la función de contener que las variables funciones. Entonces no recibirás la advertencia.

6

Sólo declaran sus VARs en un lugar como este:

var request,x,y; 
29

La razón oficial is here, por Douglas Crockford.

Para citar:

En muchos idiomas, un bloque introduce un endoscopio. Las variables introducidas en un bloque no son visibles fuera del bloque.

En JavaScript, los bloques no introducen un alcance. Solo hay ámbito de funciones. Una variable introducida en cualquier lugar de una función es visible en todas partes de la función. Los bloques de JavaScript confunden a los programadores con experiencia y provocan errores porque la sintaxis familiar es una promesa falsa.

JSLint espera bloques con la función, if, switch, while, for, do, y try statements y en ninguna otra parte.

En los lenguajes con alcance de bloque, generalmente se recomienda que las variables se declaren en el sitio de primer uso. Pero como JavaScript no tiene ámbito de bloque, es más prudente declarar todas las variables de una función en la parte superior de la función. Se recomienda utilizar una única declaración var por función. Esto se puede rechazar con la opción vars .

2

El razonamiento ya está descrito.

recomendación es usar este formulario:

var myVar1 = document.getElementById("myDiv1"), 
    myVar2 = document.getElementById("myDiv2"); 

o esto:

var myVar1, myVar2; 
myVar1 = document.getElementById("myDiv1"); 
myVar2 = document.getElementById("myDiv2"); 

Pero esto no se ve muy agradable, especialmente si desea documentar VARs.

lo que sólo puede desactivar esta advertencia temporarly:

/*jslint vars: true*/ 
    /** 
    * @returns {HTMLDivElement} 
    */ 
    var myVar1 = document.getElementById("myDiv1"); 
    /** 
    * @returns {HTMLDivElement} 
    */ 
    var myVar2 = document.getElementById("myDiv2"); 
    /*jslint vars: false*/ 

Advertencia: asegúrese de que esto se hace en la parte superior de una función.

Creo que esto se hace porque jslint no pudo determinar de manera confiable si los vars se declararon en la parte superior de la función o no.

Cuestiones relacionadas