Komunikat JSLint: Nieużywane zmienne

80

co mogę zrobić, jeśli JSLint narzeka, że ​​„i” jest nieużywaną zmienną w takim scenariuszu:

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

(i, item) jest wymaganą kolejnością parametrów i używam tylko „item”.

Czy jest jakieś inne rozwiązanie niż tolerowanie nieużywanych zmiennych lub przepisywanie $ .each do używania indeksu, obu rozwiązań, których wolałbym nie robić?

Z góry dziękuję.

Aktualizacja: Doceniam wszystkie sugestie, ale ten kod jest po prostu przykładem, który pokazuje, co mam na myśli i jestem zainteresowany, aby zobaczyć ogólne rozwiązanie, jeśli takie istnieje. Dzięki.

TheFitGeekGirl
źródło
6
W tym konkretnym przypadku this= item( api.jquery.com/jQuery.each ), więc nie musisz używać żadnego parametru. Ale na to pytanie należy prawdopodobnie odpowiedzieć w bardziej ogólnym sensie.
Greg,
Byłoby miło, gdybyśmy mogli to zrobić$.each(data, function (, item)
oscaralexander
Wiele osób używa _nieużywanego parametru , ale nie widzę sposobu, aby powiedzieć JSLint, aby specjalnie go ignorował _, chociaż byłoby to naprawdę miłe.
David J.,

Odpowiedzi:

79

Próbować:

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
źródło
+1. To zadziałało świetnie w podobnej sytuacji i mogłem umieścić to tuż przed i tuż za dotkniętą chorobą linią. Dzięki!
Ed Bayiates
4
Ponieważ nie używasz i i przeglądasz tablicę obiektów za pomocą iteratora jQuery, możesz użyć „this”:$.each([{a:0},{a:1},{a:2},{a:3}], function(){ console.log(this.a)})
3
To najlepszy sposób na zrobienie tego! / * jslint unparam: true * /
Foxinni
1
Usuń funkcję :)
2
unparamnie jest już obsługiwany przez JSLint. Zamiast tego dostarcza nowe ignoresłowo kluczowe opisane w odpowiedzi poniżej.
oyenamit
24

Myślę, że to musi być nowe w: http://www.jslint.com/help.html

„JSLint wprowadza nowe zastrzeżone słowo: ignoruj”

Więc powyższe staje się po prostu:

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

i => ignoruj ​​... zbyt łatwo. Reszta kodu może pozostać taka sama, przeglądarki są szczęśliwe, a JSLint jest szczęśliwy


Wcześniejsza (zła) odpowiedź:

Aby uspokoić zarówno JsLint, jak i przeglądarki, musiałem użyć:

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

Przeglądarka zawiesiła się na „undefined (d)”, ponieważ undefined nie był funkcją. Tak więc "undefined! == win.undefined" pomija wiersz, jeśli jesteśmy w przeglądarce.

PuZZleDucK
źródło
14
Ten nowy ignoresposób pomijania ostrzeżeń nie działa, jeśli ta sama funkcja ma więcej niż jeden nieużywany parametr.
oyenamit
możesz użyć (parameter, ignore, ignore1, ignore2, value, ignore3), przynajmniej w Webstorm dla Mac działa blokowanie ostrzeżeń reklam
Paul N
1

możesz to zrobić:

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

... ale to prawdopodobnie gorzej, jeśli o mnie chodzi.

nickf
źródło
1
@Schroedinger - o tak, na pewno. Z JSLint to zawsze kompromis. Musisz tylko sam zdecydować.
nickf
8
Naprawia jedno ostrzeżenie, powoduje kolejne „JS Lint: Użyj nazwanego parametru” :)
1

Możliwym sposobem pozbycia się ostrzeżenia w sposób dość samodokumentujący jest spowodowanie, że nieużywana zmienna zostanie wykorzystana, na przykład:

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

Oczywiście teraz możesz dostać się do sytuacji, w której oznaczysz zmienną jako nieużywaną i nadal gdzieś jej używasz. Ponadto ta metoda może być zbyt szczegółowa, w zależności od kontekstu.

Ta metoda ma tę zaletę, że jest precyzyjna. Użycie /*jslint unparam*/może być zbyt szerokie.

Magnus Hoff
źródło
4
Może to spowodować niepowodzenie testu „pustego bloku” JSLint.
jokeyrhyme
4
Ta odpowiedź działa, chociaż odradzałbym jej używanie. Wpisuję to w kategorii „rozwiązanie jest gorsze niż problem”.
David J.
1
Byłoby bardziej pomocne dla innych czytelników, gdybyście dodali kilka szczegółów na temat tego, co jest złego w tym rozwiązaniu, @superluminary i DavidJames. Nie mam problemu z osobami, które nie lubią tego rozwiązania, ale dodanie komentarza mówiącego, że nikomu nie pomaga. :)
Magnus Hoff
6
Przepraszamy Magnus, komentarz usunięty. Powodem, dla którego nie podoba mi się to rozwiązanie, jest to, że dodajesz kod niesemantyczny jedynie w celu oszukania określonej wersji określonego walidatora w celu przekazania twojego kodu. To hack, nie dodaje znaczenia do kodu i nie będzie się dobrze starzeć. Właściwym rozwiązaniem jest modyfikacja JSLint.
superluminium
@superluminary Dziękuję za rozwinięcie :)
Magnus Hoff
1

Co powiesz na użycie, voidaby wyraźnie zaznaczyć, że celowo nie używasz zmiennej?

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

Jest to również przydatne w funkcjach abstrakcyjnych, które mają zostać nadpisane, ale gdzie chcesz pokazać podpis lub w makietach, w których ignorujesz argumenty, ale chcesz dopasować podpis funkcji mockowanej.

xn.
źródło
3
używanie void nie wydaje się przechodzić JSLint
xorcus
Korzystanie z voidprzyczyn Expected 'undefined' and instead saw 'void'. undefined(i, any, other, unused, vars);Jednak użycie przekazuje JSLint.
maheshsenni
1

Zmieniam nazwę „i” na „nieużywane”. Oczywiście nadal pozostawia błąd, ale widzę go na liście i wiem, że „sprawdziłem” ten błąd i zgadzam się z tym.

DharmaTurtle
źródło
Nie jest to zły pomysł, ale jeśli wykonujesz ciągłą integrację i chcesz lintować cały kod przed zezwoleniem na scalenie kodu, to nie zadziała, jeśli traktujesz ostrzeżenia jako błędy.
1
Jak wspomniano w tej odpowiedzi, zmień nazwę nieużywanej zmiennej na „ignoruj”, a zostanie ona zweryfikowana przez JSLint. Więc „ignoruj” zamiast „nieużywane” i gotowe (ograniczenie: obsługuje tylko jedną nieużywaną zmienną w tej samej funkcji)
Emilien
0

Jeśli funkcja ma więcej niż jeden nieużywany parametr, możesz użyć „ignoruj” w ten sposób:

function (ignoreFoo, ignoreBar, baz) {
}

Musi po prostu zaczynać się od zarezerwowanego słowa „ignore” (ignore, ignoreFoo, ignoreBar, ...).

Pilipe
źródło
Jest to zasadniczo to samo, co odpowiedź PuZZleDucK . Jeśli dodasz odpowiedź, gdy jest już kilka, a zwłaszcza jeśli są znacznie starsze i już przegłosowane, upewnij się, że nie powtarzasz tylko innej odpowiedzi, lub, jeśli jest różnica, wyraźnie zacytuj drugą i wskaż różnica wyraźnie. Dziękuję Ci!
Fabio mówi Przywróć Monikę
2
Z następującym kodem (3 nieużywane zmienne) tylko pierwsza „ignore” przechodzi walidację JSLint, ostatnie dwa parametry wyzwalają „Unused 'ignoreOne'” i „Unused 'ignoreTwo'”videos.forEach(function (ignore, i, ignoreOne, ignoreTwo)
Emilien
Zadeklarowano „ignoreInterval”, ale jego wartość nigdy nie jest odczytywana. Teraz pojawia się dłuższy błąd :(
noob7