Mensaje JSLint: variables no utilizadas


80

¿Qué puedo hacer si JSLint se queja de que "i" es una variable no utilizada en tal escenario?

var items = "<option selected></option>";
$.each(data, function (i, item) {
    items += "<option value='" + item.Value + "'>" + item.Text + "</option>";
});

(i, item) es el orden requerido de parámetros y solo estoy usando "item".

¿Hay alguna otra solución que tolerar las variables no utilizadas o reescribir el $ .each para usar el índice, ambas soluciones que preferiría no hacer?

Gracias por adelantado.

Actualización: Agradezco todas las sugerencias, pero este código es simplemente un ejemplo para mostrarle lo que quiero decir y estoy interesado en ver una solución general, si la hay. Gracias.


6
En este caso particular this= item( api.jquery.com/jQuery.each ), por lo que no tendría que usar ninguno de los parámetros. Pero esta pregunta probablemente debería responderse en un sentido más general.
— Greg

Sería tan bueno si pudiéramos hacerlo$.each(data, function (, item)
— oscaralexander

Mucha gente usa _para un parámetro no utilizado , pero no veo forma de decirle a JSLint que lo ignore específicamente _, aunque eso sería realmente bueno.
— David J.

Respuestas:


79

Tratar:

var items = "<option selected></option>";
/*jslint unparam: true*/
$.each(data, function (i, item) {
    items += "<option value='" + item.Value + "'>" + item.Text + "</option>";
});
/*jslint unparam: false*/  // so that you still get warnings from other functions

+1. Esto funcionó muy bien para mí en una situación similar, y pude ponerlo justo antes y justo después de la línea afectada. ¡Gracias!
— Ed Bayiates

4
Como no está usando i y está iterando a través de una matriz de objetos usando el iterador de jQuery, puede usar "this":$.each([{a:0},{a:1},{a:2},{a:3}], function(){ console.log(this.a)})

3
¡Esta es la mejor manera de hacerlo! / * jslint unparam: true * /
— Foxinni

1
Eliminar la función :)

2
unparamJSLint ya no es compatible. En cambio, proporciona la nueva ignorepalabra clave que se describe en una respuesta a continuación.
— oyenamit

24

Creo que esto debe ser nuevo en: http://www.jslint.com/help.html

"JSLint introduce una nueva palabra reservada: ignorar"

Entonces lo anterior simplemente se convierte en:

$.each(data, function (ignore, item) {

i => ignorar ... demasiado fácil. El resto del código puede permanecer igual, los navegadores están contentos y JSLint está contento


Respuesta anterior (incorrecta):

Para aplacar tanto a JsLint como a los navegadores, necesitaba usar:

function (d, i) {
        if (undefined !== win.undefined) {
            undefined(d);
        }
        return (i);
}

El navegador se bloqueó en "undefined (d)" debido a que undefined no es una función. Entonces, "undefined! == win.undefined" salta la línea si estamos en un navegador.


14
Esta nueva ignoreforma de suprimir las advertencias falla si la misma función tiene más de un parámetro sin usar.
— oyenamit

puede usar (parámetro, ignorar, ignorar1, ignorar2, valor, ignorar3), al menos en Webstorm para Mac funciona la supresión de advertencias de anuncios
— Paul N

1

podrías hacer esto:

var items = "<option selected></option>";
$.each(data, function () {
    var item = arguments[1];
    items += "<option value='" + item.Value + "'>" + item.Text + "</option>";
});

... pero probablemente sea peor si me preguntas.


1
@Schroedinger - oh sí, seguro. Siempre es una compensación con JSLint. Solo tienes que decidir por ti mismo.
— nickf

8
Corrige una advertencia, provoca otro "JS Lint: Use un parámetro con nombre" :)

1

Una forma posible de deshacerse de la advertencia de una manera bastante autodocumentada es hacer que la variable no utilizada se utilice, así:

// Utility function in project scope:
function unusedVariables(/* Put all your deliberately unused variables here */) {
    // pass
}

// And then, later:
var items = "<option selected></option>";
$.each(data, function (i, item) {
    unusedVariables(i); //< This is the new and magical line
    items += "<option value='" + item.Value + "'>" + item.Text + "</option>";
});

Por supuesto, ahora puede entrar en la situación en la que marca una variable como no utilizada y aún la usa en alguna parte. Además, este método puede ser demasiado detallado, según el contexto.

Este método tiene la ventaja de que es preciso. El uso /*jslint unparam*/puede ser demasiado amplio.


4
Esto puede fallar la prueba de "bloque vacío" de JSLint.
— jokeyrhyme

4
Esta respuesta "funciona", aunque recomendaría no usarla. Lo presento bajo "la solución es peor que el problema".
— David J.

1
Sería más útil para otros lectores si ustedes agregaran algunos detalles sobre lo malo de esta solución, @superluminary y DavidJames. No tengo ningún problema con que a la gente no le guste esta solución, pero agregar un comentario que diga eso no ayuda a nadie. :)
— Magnus Hoff

6
Disculpas Magnus, comentario eliminado. La razón por la que no me gusta esta solución es porque está agregando código no semántico simplemente con el propósito de engañar a una versión específica de un validador específico para que pase su código. Es un truco, no agrega significado al código y no envejecerá bien. La solución adecuada es modificar JSLint.
— superluminario

@superluminary Gracias por elaborar :)
— Magnus Hoff

1

¿Qué tal usar voidpara hacer explícito que no está usando intencionalmente la variable?

$.each(data, function (i, item, any, other, unused, vars) {
  void(i, any, other, unused, vars);
  items += "<option value='" + item.Value + "'>" + item.Text + "</option>";
});

Esto también es útil en funciones abstractas que se espera que se sobrescriban, pero donde desea mostrar la firma, o en simulaciones, donde ignora los argumentos, pero desea hacer coincidir la firma de la función simulada.


3
el uso de void no parece pasar JSLint
— xorcus

Usando voidcausas Expected 'undefined' and instead saw 'void'. undefined(i, any, other, unused, vars);Sin embargo, el uso de pasa JSLint.
— maheshsenni

1

Cambio el nombre de "i" como "no utilizado". Todavía deja el error obviamente, pero lo veo en la lista y sé que he "verificado" ese error y estoy de acuerdo con él.


Esta no es una mala idea, pero si realiza una integración continua y desea eliminar todo el código antes de permitir que se fusione, entonces esto no funciona si está tratando las advertencias como errores.

1
Como se menciona en esta respuesta, cambie el nombre de la variable no utilizada a "ignorar" y será validada por JSLint. Así que "ignorar" en lugar de "no utilizado", y ya está todo listo (limitación: admite solo una variable no utilizada en la misma función)
— Emilien


0

Si la función tiene más de un parámetro sin usar, puede usar "ignorar" así:

function (ignoreFoo, ignoreBar, baz) {
}

Simplemente debe comenzar con la palabra reservada "ignore" (ignore, ignoreFoo, ignoreBar, ...).


Esto es sustancialmente lo mismo que la respuesta de PuZZleDucK . Si agrega una respuesta cuando ya hay algunas, y especialmente si son mucho más antiguas y ya han votado a favor, asegúrese de no estar simplemente repitiendo otra respuesta o, si hay una diferencia, cite explícitamente la otra y señale la diferencia claramente. ¡Gracias!
— Fabio dice Reincorporar a Monica

2
Con el siguiente código (3 variables no utilizadas), solo el primer "ignore" pasa la validación JSLint, los dos últimos parámetros activan "Unused 'ignoreOne'" y "Unused 'ignoreTwo'"videos.forEach(function (ignore, i, ignoreOne, ignoreTwo)
— Emilien

'ignoreInterval' se declara pero su valor nunca se lee. Ahora recibo un error más largo :(
— noob7
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.