JSLint (con el indicador onevar activado) está marcando un código javascript que tengo con lo siguiente:

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

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

Miré los documentos de JSLint para la palabra clave var pero no habla específicamente de por qué varias declaraciones var en la misma función son malas.

Aquí hay un intento de un ejemplo. Explique cómo se beneficiará el código al tener solo 1 instrucción 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 */);

   }
}
63
slolife 1 may. 2009 a las 09:42

7 respuestas

La mejor respuesta

Javascript no tiene alcance de bloque. En otros idiomas con él (como c), si declara una variable en la instrucción if, no puede acceder a ella fuera de ella, pero en javascript sí. 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 hacerlo. Por lo tanto, debe declarar todas sus variables en la parte superior de la función.

98
Juri 1 may. 2011 a las 07:53

Simplemente declara tus vars en un lugar como este:

var request,x,y;
6
alex 17 ago. 2011 a las 01:36

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

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

Cámbielo a:

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

Luego puede acceder a estas variables a través del objeto, es más fácil tener un objeto por función para contener las variables de las funciones. Entonces no recibirás la advertencia.

-6
sth 21 sep. 2009 a las 00:45

Solo una suposición aquí, pero puede ser hora de descomposición funcional. Las funciones deben hacer una cosa y hacerlo bien.

Demasiados vars sugieren una función que intenta hacer demasiado. O un caso en el que deberías estar usando una matriz.

1
Community 23 may. 2017 a las 12:09

La razón oficial está aquí, por Douglas Crockford.

Citar:

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

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

JSLint espera bloques con funciones, if, switch, while, for, do e try, y ningún otro lugar.

En idiomas con alcance de bloque, generalmente se recomienda que las variables se declaren en el sitio de primer uso. Pero debido a que JavaScript no tiene un alcance de bloque, es más inteligente declarar todas las variables de una función en la parte superior de la función. Se recomienda que se use una sola declaración var por función. Esto se puede rechazar con la opción vars.

28
Nope 30 oct. 2012 a las 13:04

El razonamiento ya está descrito.

La recomendación es utilizar 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 bien, especialmente si desea documentar vars.

Entonces puede deshabilitar esta advertencia temporalmente:

  /*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 haga 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.

2
Vanuan 13 oct. 2012 a las 23:08

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

if (funct['(onevar)'] && option.onevar) {
    warning("Too many var statements.");
}
3
tom 1 may. 2009 a las 05:58