vscode visual studio snippets linter extensions extension ejecutar code best javascript refactoring jslint

javascript - visual - ¿Cuál es la razón detrás de JSLint diciendo que hay "demasiadas declaraciones var"



vscode javascript snippets (7)

El razonamiento ya está descrito.

La 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 bien, especialmente si quieres documentar vars.

Entonces puedes desactivar 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.

JSLint (con la bandera onevar encendida) está marcando algunos códigos javascript que tengo con lo siguiente:

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

Me complace 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 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 la palabra clave var pero no habla específicamente sobre por qué varias sentencias var en la misma función son malas.

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


Javascript no tiene alcance de bloque. 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.


La idea es que deberías usar un objeto en lugar de vars individuales. Entonces, donde tienes:

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

Cambiarlo 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, es más preciso tener un objeto por función para contener las variables de las funciones. Entonces no recibirás la advertencia.


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 un alcance de función. 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 experimentados y conducen a errores porque la sintaxis familiar es una promesa falsa.

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

En los idiomas con alcance de bloque, generalmente se recomienda que las variables se declaren en el sitio de primer uso. Pero como JavaScript no tiene alcance 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.


Sólo adivine aquí, pero puede ser el momento de la descomposición funcional . Las funciones deberían hacer una cosa y hacerlo bien.

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


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


Simplemente declara tus vars en un lugar como este:

var request,x,y;