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.

TheFitGeekGirl
fuente
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
nickf
fuente
+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.

PuZZleDucK
fuente
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.

nickf
fuente
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.

Magnus Hoff
fuente
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.

xn.
fuente
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.

DharmaTurtle
fuente
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

En este caso particular de transformar una matriz / objeto, http://api.jquery.com/jquery.map/ (o http://api.jquery.com/map/ ?) Es una opción.

var items = "<option selected></option>" + $.map(data, function (item) { 
    return "<option value='" + item.Value + "'>" + item.Text + "</option>";
}).get().join('');
Greg Domjan
fuente
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, ...).

Pilipe
fuente
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