Повідомлення JSLint: невикористані змінні


80

що я можу зробити, якщо JSLint скаржиться на те, що "i" є невикористовуваною змінною в такому сценарії:

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

(i, item) - це необхідний порядок параметрів, і я використовую лише "item".

Чи є якесь інше рішення, крім терпіння невикористаних змінних чи переписування $ .each для використання індексу, і того, і іншого рішення, яких я волів би не робити?

Заздалегідь спасибі.

Оновлення: Я ціную всі пропозиції, але цей код є просто прикладом, щоб показати вам, що я маю на увазі, і я зацікавлений побачити загальне рішення, якщо таке є. Дякую.


6
У цьому конкретному випадку this= item( api.jquery.com/jQuery.each ), тому вам не доведеться використовувати жоден параметр. Але на це питання, мабуть, слід відповісти в більш загальному розумінні.
Грег

Було б так приємно, якби ми могли це зробити$.each(data, function (, item)
oscaralexander

Відповіді:


79

Спробуйте:

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. Це чудово спрацювало для мене в подібній ситуації, і я зміг поставити це безпосередньо перед і відразу після ураженої лінії. Дякую!
Ед Байятес,

4
Оскільки ви не використовуєте i, а виконуєте ітерацію через масив об'єктів, використовуючи ітератор jQuery, ви можете використовувати "this":$.each([{a:0},{a:1},{a:2},{a:3}], function(){ console.log(this.a)})

3
Це найкращий спосіб зробити це! / * jslint unparam: true * /
Фоксінні

1
Видалити функцію :)

2
unparamбільше не підтримується JSLint. Натомість воно надає нове ignoreключове слово, описане у відповіді нижче.
oyenamit

24

Я думаю, що це має бути новим у: http://www.jslint.com/help.html

"JSLint вводить нове зарезервоване слово: ігнорувати"

Отже, вищесказане просто стає:

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

i => ігнорувати ... занадто просто. Решта коду може залишитися незмінною, браузери задоволені і JSLint задоволені


Раніше (неправильна) відповідь:

Щоб розмістити як JsLint, так і браузери, які мені потрібно було використовувати:

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

Браузер зазнав аварії на "undefined (d)" через те, що undefined не є функцією. Тож "undefined! == win.undefined" пропускає рядок, якщо ми знаходимось у браузері.


14
Цей новий ignoreспосіб придушення попереджень виходить з ладу, якщо одна і та ж функція має більше одного невикористаного параметра.
oyenamit

ви можете використовувати (параметр, ігнорувати, ігнорувати1, ігнорувати2, значення, ігнорувати3), принаймні на Webstorm для Mac працює попередження про придушення оголошень
Paul N

1

Ви можете зробити це:

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

... але це, мабуть, гірше, якщо ви запитаєте мене.


1
@Schroedinger - о так, точно. Це завжди компроміс з JSLint. Ви просто повинні вирішити самі.
nickf

8
Виправлено одне попередження, викликало інше "JS Lint: Use a named parameter" :)

1

Можливий спосіб позбутися попередження способом, який досить самодокументується, - це використати невикористовувану змінну, наприклад:

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

Звичайно, тепер ви можете потрапити в ситуацію, коли ви позначаєте змінну як невикористовувану, і все одно десь використовуєте її. Крім того, цей метод може бути занадто багатослівним, залежно від контексту.

Цей метод має перевагу в тому, що він точний. Використання /*jslint unparam*/може бути занадто широким.


4
Це може провалити тест "порожнього блоку" JSLint.
jokeyrhyme

4
Ця відповідь працює, але я б не рекомендував її використовувати. Я подаю його в розділі "Рішення гірше, ніж проблема".
Девід Дж.

1
Іншим читачам було б корисніше, якби ви, хлопці, додали детальну інформацію про те, що погано в цьому рішенні, @superluminary та DavidJames. У мене немає проблем із тим, що людям не подобається це рішення, але додаючи коментар, який говорить, що саме це нікому не допомагає. :)
Магнус Хофф

6
Вибачення Магнус, коментар видалено. Причина, через яку мені не подобається це рішення, полягає в тому, що ви додаєте несемантичний код лише з метою обману конкретної версії конкретного валідатора для передачі вашого коду. Це хакерство, це не додає значення коду і погано старіє. Правильним рішенням є модифікація JSLint.
надсвітний

@superluminary Дякую, що розказали :)
Магнус Хофф,

1

Як щодо використання, voidщоб зробити явним, що ви навмисно не використовуєте змінну?

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

Це також корисно в абстрактних функціях, які, як очікується, будуть перезаписані, але там, де ви хочете показати підпис, або в макетах, де ви ігноруєте аргументи, але хочете відповідати підпису знущаної функції.


3
використання void, здається, не проходить
JSLint

Використання voidпричин Expected 'undefined' and instead saw 'void'. undefined(i, any, other, unused, vars);Однак використання проходів JSLint.
maheshsenni

1

Я перейменовую "i" як "невикористаний". Це все одно залишає помилку очевидно, але я бачу її у списку і знаю, що я "перевірив" цю помилку і з нею в порядку.


Це непогана ідея, але якщо ви робите постійну інтеграцію і хочете залишити весь код перед тим, як дозволити злиття коду, це не спрацює, якщо ви сприймаєте попередження як помилки.

1
Як згадано у цій відповіді, перейменуйте невикористовувану змінну на "ігнорувати", і вона буде перевірена JSLint. Тож "ігноруй" замість "невикористаний", і все готово (обмеження: підтримує лише одну невикористовувану змінну в тій самій функції)
Емільєн


0

Якщо функція має декілька невикористаних параметрів, ви можете використовувати "ігнорувати" таким чином:

function (ignoreFoo, ignoreBar, baz) {
}

Він повинен просто починатися із зарезервованого слова "ігнорувати" (ignore, ignoreFoo, ignoreBar, ...).


Це фактично те саме , що відповідь PuZZleDucK . Якщо ви додаєте відповідь, коли вже є деякі, і особливо якщо вони набагато старші і вже проголосували, будь ласка, переконайтеся, що ви не просто повторюєте іншу відповідь, або, якщо є різниця, процитуйте явно іншу та вкажіть на різниця чітко. Дякую!
Фабіо каже "Відновити Моніку"

2
За допомогою наступного коду (3 невикористовуваних змінних) тільки перший «ігнорувати» проходить перевірку JSLint, останні два параметра тригер «невикористаний" ignoreOne "» і «невикористаний" ignoreTwo "»videos.forEach(function (ignore, i, ignoreOne, ignoreTwo)
Emilien

оголошено 'ignoreInterval', але його значення ніколи не читається. Тепер я отримую довшу помилку :(
noob7
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.