Ошибка JSLint: неожиданное '-' - PullRequest
       44

Ошибка JSLint: неожиданное '-'

4 голосов
/ 08 февраля 2012

Я получаю две ошибки в файле JS, обе «Неожиданные» - ». Это код для прокрутки колесика мыши (оба раза как this.addEventListener( types[--i], handler, false );). Я никогда раньше не видел этот синтаксис --i. Что это такое, и как мне исправить это, чтобы сделать JSLint счастливее?

(function($) {
var types = ['DOMMouseScroll', 'mousewheel'];
$.event.special.mousewheel = {
    setup: function() {
        var i;
        if ( this.addEventListener ) {
            i = types.length;
            while ( i >= 0 ) {
                this.addEventListener( types[--i], handler, false );
            }
        } else {
            this.onmousewheel = handler;
        }
    },

    teardown: function() {
        if ( this.removeEventListener ) {
            i = types.length;
            while ( i >= 0 ) {
                this.removeEventListener( types[--i], handler, false );
            }
        } else {
            this.onmousewheel = null;
        }
    }
};

Ответы [ 4 ]

6 голосов
/ 08 февраля 2012

--n синтаксис уменьшает переменную.Чуть более распространенным является то, что вы могли видеть n++, что аналогично, но увеличивает переменную.

-- или ++ могут появляться до или после переменной, и естьтонкая разница.Когда он приходит раньше, он изменяет значение, а затем возвращает измененное значение.Когда это прибывает после, это возвращает оригинальное значение.При непосредственном использовании значения это имеет значение.

var i;

// affix
i = 1; console.log(i++, i) // 1 2
i = 1; console.log(i--, i) // 1 0

// prefix
i = 1; console.log(++i, i) // 2 2
i = 1; console.log(--i, i) // 0 0

Обратите внимание, что значение префиксного выражения приращения или уменьшения возвращает то же значение для i после операции, в отличие от версии аффикса.

Итак, короче говоря, JSLint не очень любит префиксные операторы приращения.Но это должно быть эквивалентно:

while ( i >= 0 ) {
  i -= 1;
  this.removeEventListener( types[i], handler, false );
}

Не используя прямой результат операции декремента, он перестает иметь значение, как работает этот оператор и что он возвращает.Это также немного более явно, и JSLint любит явно.

3 голосов
/ 08 февраля 2012

JSLint отклоняет все операторы --i, i--, ++i и i++.

, просто поместите строку с

i -= 1;

перед обеими строками с ошибкамии замените --i просто i, и JSLint должен быть доволен.

--i уменьшает переменную i на один перед выполнением окружающего оператора.удобочитаемость кода, использующего это, хуже, чем код без него.Вот почему JSLint не рекомендует использовать его.

1 голос
/ 08 февраля 2012

Измените строку на:

this.addEventListener( types[i -= 1], handler, false );

чтобы сделать JSLint счастливым.

См. Зачем избегать операций увеличения ("++") и уменьшения ("-") в JavaScript? и постинкремент против предварительного увеличения - Оптимизация Javascript (и другие по прибегая к помощи "javascript до и после приращения"), для чего ++ и - на самом деле.

1 голос
/ 08 февраля 2012

Измените это:

while ( i >= 0 ) {
    this.addEventListener( types[--i], handler, false );
}

На это:

while ( i >= 0 ) {
    i -= 1;
    this.addEventListener( types[i], handler, false );
}

Оператор -- перед переменной уменьшает значение переменной перед использованием, сохраняя новое значение впеременная.Таким образом, --i является предварительным декрементом и означает "установите i в значение i-1, затем продолжите то, что вы собирались сделать с i" .Противоположной операцией будет пост-декремент (i--), что означает "использовать i как есть для текущей операции, а затем установить значение i-1" .

Крокфорд по умолчанию JSLint отвергает подобные операции, потому что считает, что это сбивает с толку, трудно читается и менее обслуживаемо.Вы также можете пойти по пути настройки инструмента LINT для «Допуск - и ++» (свойство LINT plusplus: true).Однако в вашем случае корректировка кода минимальна, поэтому редактирование, вероятно, предпочтительнее.

...