JSLint-Nachricht: Nicht verwendete Variablen

80

Was kann ich tun, wenn sich JSLint darüber beschwert, dass "i" in einem solchen Szenario eine nicht verwendete Variable ist:

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

(i, item) ist die erforderliche Reihenfolge der Parameter und ich verwende nur "item".

Gibt es eine andere Lösung als nicht verwendete Variablen zu tolerieren oder $ .each neu zu schreiben, um den Index zu verwenden, beides Lösungen, die ich lieber nicht tun würde?

Danke im Voraus.

Update: Ich freue mich über alle Vorschläge, aber dieser Code ist nur ein Beispiel, um Ihnen zu zeigen, was ich meine, und ich bin daran interessiert, eine allgemeine Lösung zu finden, falls es welche gibt. Vielen Dank.

TheFitGeekGirl
quelle
6
In diesem speziellen Fall this= item( api.jquery.com/jQuery.each ), sodass Sie keinen der beiden Parameter verwenden müssen. Aber diese Frage sollte wahrscheinlich allgemeiner beantwortet werden.
Greg
Es wäre so schön, wenn wir es einfach tun könnten$.each(data, function (, item)
oscaralexander
Viele Leute verwenden _einen nicht verwendeten Parameter , aber ich sehe keine Möglichkeit, JSLint anzuweisen , ihn spezifisch zu ignorieren _, obwohl das wirklich nett wäre.
David J.

Antworten:

79

Versuchen:

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
quelle
+1. In einer ähnlichen Situation funktionierte dies hervorragend für mich, und ich konnte es kurz vor und kurz nach der betroffenen Linie platzieren. Vielen Dank!
Ed Bayiates
4
Da Sie i nicht verwenden und mit jQuerys Iterator durch ein Array von Objekten iterieren, können Sie "this" verwenden:$.each([{a:0},{a:1},{a:2},{a:3}], function(){ console.log(this.a)})
3
Dies ist der beste Weg, um es zu tun! / * jslint unparam: true * /
Foxinni
1
Löschen Sie die Funktion :)
2
unparamwird von JSLint nicht mehr unterstützt. Stattdessen wird das neue ignoreSchlüsselwort bereitgestellt, das in der folgenden Antwort beschrieben wird.
Oyenamit
24

Ich denke, das muss neu sein in: http://www.jslint.com/help.html

"JSLint führt ein neues reserviertes Wort ein: Ignorieren"

So wird das Obige einfach:

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

i => ignorieren ... zu einfach. Der Rest des Codes kann gleich bleiben, die Browser sind zufrieden und JSLint ist zufrieden


Frühere (falsche) Antwort:

Um sowohl JsLint als auch Browser zu beruhigen, musste ich Folgendes verwenden:

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

Der Browser stürzte bei "undefined (d)" ab, da undefined keine Funktion ist. Das "undefined! == win.undefined" überspringt also die Zeile, wenn wir uns in einem Browser befinden.

PuZZleDucK
quelle
14
Diese neue ignoreArt der Unterdrückung von Warnungen bricht zusammen, wenn dieselbe Funktion mehr als einen nicht verwendeten Parameter hat.
Oyenamit
Sie können verwenden (Parameter, ignorieren, ignorieren1, ignorieren2, Wert, ignorieren3), zumindest auf Webstorm für Mac funktioniert Werbung und unterdrückt Warnungen
Paul N
1

Sie könnten dies tun:

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

... aber das ist wahrscheinlich schlimmer, wenn du mich fragst.

nickf
quelle
1
@Schroedinger - oh ja, sicher. Es ist immer ein Kompromiss mit JSLint. Sie müssen nur selbst entscheiden.
Nickf
8
Behebt eine Warnung und verursacht eine weitere "JS Lint: Verwenden Sie einen benannten Parameter" :)
1

Eine Möglichkeit, die Warnung auf eine Weise zu entfernen, die ziemlich selbstdokumentierend ist, besteht darin, die nicht verwendete Variable wie folgt zu verwenden:

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

Natürlich können Sie jetzt in die Situation geraten, in der Sie eine Variable als nicht verwendet markieren und sie trotzdem irgendwo verwenden. Außerdem ist diese Methode je nach Kontext möglicherweise zu ausführlich.

Diese Methode hat den Vorteil, dass sie präzise ist. Die Verwendung ist /*jslint unparam*/möglicherweise zu weit gefasst.

Magnus Hoff
quelle
4
Dies kann den JSLint-Test "leerer Block" nicht bestehen.
Jokeyrhyme
4
Diese Antwort funktioniert, obwohl ich davon abraten würde, sie zu verwenden. Ich lege es unter "Die Lösung ist schlimmer als das Problem" ab.
David J.
1
Für andere Leser wäre es hilfreicher, wenn Sie einige Details darüber hinzufügen würden, was an dieser Lösung, @superluminary und DavidJames, schlecht ist. Ich habe kein Problem damit, dass Leute diese Lösung nicht mögen, aber einen Kommentar hinzuzufügen, der besagt, dass das niemandem hilft. :)
Magnus Hoff
6
Entschuldigung Magnus, Kommentar gelöscht. Der Grund, warum ich diese Lösung nicht mag, ist, dass Sie nicht-semantischen Code nur hinzufügen, um eine bestimmte Version eines bestimmten Validators zur Übergabe Ihres Codes zu verleiten. Es ist ein Hack, es fügt dem Code keine Bedeutung hinzu und es wird nicht gut altern. Die richtige Lösung besteht darin, JSLint zu ändern.
Superluminary
@ Superluminary Vielen Dank für die Ausarbeitung :)
Magnus Hoff
1

Wie wäre es mit void, um deutlich zu machen, dass Sie die Variable absichtlich nicht verwenden?

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

Dies ist auch nützlich bei abstrakten Funktionen, von denen erwartet wird, dass sie überschrieben werden, bei denen Sie jedoch die Signatur anzeigen möchten, oder bei Verspottungen, bei denen Sie Argumente ignorieren, aber mit der Signatur der verspotteten Funktion übereinstimmen möchten.

xn.
quelle
3
Die Verwendung von void scheint JSLint
xorcus
Mit voidUrsachen Expected 'undefined' and instead saw 'void'. Verwenden von undefined(i, any, other, unused, vars);Pässen JSLint.
Msenni
1

Ich benenne "i" in "unbenutzt" um. Der Fehler bleibt offensichtlich bestehen, aber ich sehe ihn in der Liste und weiß, dass ich diesen Fehler "überprüft" habe und damit einverstanden bin.

DharmaTurtle
quelle
Dies ist keine schlechte Idee. Wenn Sie jedoch eine kontinuierliche Integration durchführen und den gesamten Code fusseln möchten, bevor Sie das Zusammenführen von Code zulassen, funktioniert dies nicht, wenn Sie Warnungen als Fehler behandeln.
1
Benennen Sie die nicht verwendete Variable wie in dieser Antwort erwähnt in "Ignorieren" um und sie wird von JSLint überprüft. Also "ignorieren" statt "nicht verwendet", und Sie sind fertig (Einschränkung: unterstützt nur eine nicht verwendete Variable in derselben Funktion)
Emilien
0

In diesem speziellen Fall der Transformation eines Arrays / Objekts ist http://api.jquery.com/jquery.map/ (oder http://api.jquery.com/map/ ?) Eine Option.

var items = "<option selected></option>" + $.map(data, function (item) { 
    return "<option value='" + item.Value + "'>" + item.Text + "</option>";
}).get().join('');
Greg Domjan
quelle
0

Wenn die Funktion mehr als einen nicht verwendeten Parameter hat, können Sie "ignorieren" wie folgt verwenden:

function (ignoreFoo, ignoreBar, baz) {
}

Es muss einfach mit dem reservierten Wort "ignore" beginnen (ignore, ignoreFoo, ignoreBar, ...).

Pilipe
quelle
Dies entspricht im Wesentlichen der Antwort von PuZZleDucK . Wenn Sie eine Antwort hinzufügen, wenn es bereits einige gibt, und insbesondere wenn diese viel älter und bereits positiv bewertet sind, stellen Sie bitte sicher, dass Sie nicht nur eine andere Antwort wiederholen, oder zitieren Sie, wenn es einen Unterschied gibt, ausdrücklich die andere und weisen Sie auf die Antwort hin Unterschied deutlich. Vielen Dank!
Fabio sagt Reinstate Monica
2
Mit dem folgenden Code (3 nicht verwendete Variablen) besteht nur das erste "Ignorieren" die JSLint-Validierung. Die letzten beiden Parameter lösen "Unbenutztes 'Ignorieren eines" und "Nicht verwendetes' Ignorieren von Zwei" ausvideos.forEach(function (ignore, i, ignoreOne, ignoreTwo)
Emilien
'ignoreInterval' wird deklariert, sein Wert wird jedoch nie gelesen. Jetzt bekomme ich einen längeren Fehler :(
noob7