Ошибка JSLint: переместите все объявления "var" в начало функции

Обновлен сайт JSLint, и я больше не могу проверять скрипты JS. Для меня это предупреждение не критично, и я не хочу проходить через тысячи строк, чтобы исправить это, я хочу найти более важные проблемы.

Кто-нибудь знает, как отключить эту ошибку или использовать устаревший JSLint?

UPDATE

Пример:

function doSomethingWithNodes(nodes){
  this.doSomething();

  for (var i = 0; i < nodes.length; ++i){
    this.doSomethingElse(nodes[i]);
  }

  doSomething(); // want to find this problem
}

Выход jslint.com:

Error:
Problem at line 4 character 8: Move all 'var' declarations to the top of the function.

for (var i = 0; i < nodes.length; ++i){

Problem at line 4 character 8: Stopping, unable to continue. (44% scanned).

Проблема:

Наличие переменных в верхней части функций является новым требованием. Я не могу использовать JSLINT для проверки кода, потому что он останавливает сканирование script на этой ошибке.

У меня много кода, и я не хочу угрожать этому предупреждению как критическую ошибку.

UPDATE 8/22/2011: найдено http://jshint.com, он выглядит намного лучше, чем http://jslint.com/

Ответы

Ответ 1

Обновление Июнь 2017: При условии поддержки (например, если вы не используете JavaScript в Internet Explorer 10 или ниже), вам следует изучить let вместо var.

Например: for(let i=0; ...; i++)


Я не собираюсь ставить var i; из for(var i=0; ...; i++) в верхней части моих функций. Особенно, если Спецификация JavaScript имеет его как приемлемый синтаксис в разделе for (12.6). Кроме того, в его примерах используется синтаксис Brendan Eich.

Идея перемещения объявления наверху заключается в том, что он должен более точно отражать то, что происходит под капотом, однако, это будет отражать, а не влиять.

Для меня это смехотворное ожидание для итераций for. Тем более что JSLint прекращает обработку, когда обнаруживает его.

Возможно ли, что переменные, объявленные в верхней части функции, более читаемы, являются спорными. Я лично предпочитаю, чтобы переменные итератора были объявлены, когда они используются. Мне все равно, если переменная уже создана внутри, я инициализирую ее здесь, чтобы я был в безопасности.

Я бы сказал, что объявление переменной итератора, в которой они используются, гарантирует, что они не будут случайно сделаны глобальными (если вы переместите цикл в другую функцию, переменная итератора перемещается вместе с ней). Это гораздо более удобно, чем необходимость поддерживать объявления переменных в верхней части функций.

В настоящее время я использую http://www.javascriptlint.com/online_lint.php, потому что он, похоже, фокусируется на важном материале.

Ответ 2

Компилятор Google Closure на самом деле не сможет правильно определить тип переменной цикла для цикла for... in, если он не объявлен как для (var я in...), и никакая аннотация, похоже, не исправляет это, поэтому объявление не может быть перемещен в начало.

Ответ 3

Вы можете скачать устаревшие версии в любое время или изменить последнюю версию. Это не так сложно, действительно (поиск move_var). Затем запустите jslint локально, либо используя node, либо используя браузер с простой формой HTML - вы можете скопировать оригинал Crockford.

Обратите внимание, что предупреждение было введено как часть

Ответ 4

Обратите внимание, что перемещение всех vars вверху отличается от "разрешить один оператор var для каждой функции". Требование переместить все переменные в начало является новым и, похоже, не имеет переключателя. Подробнее в http://groups.google.com/group/jsmentors/browse_thread/thread/5e90c25230f8e22/70e1a95a20fb829e

Ответ 5

У меня была эта проблема на моей кодовой базе, когда мы хотели перейти на последнюю версию JSLINT. У нас было много тех, и люди не были рады переместить декларацию. На самом деле мы обнаружили, что наиболее элегантным решением было использование underscore.js и вместо полного набора подробностей использовать функцию _.each(), которая удалила ошибку JSLint и сделала наш код более функциональным, более чистым, более жестким и легким для читать.

Ответ 6

Несмотря на то, что новая бета JSLint не документирует директиву комментариев для множественного допуска var внутри функции, она появляется для поддержки директив исходной версии.

Оригинальный JSLint позволил вам сделать это:

/*jslint vars: true */

По моему опыту это все еще работает - я полагаю, для обратной совместимости. Время написания - июнь 2015 года.

Ответ 7

Я обнаружил, что следующий синтаксис удалит ошибку:

function doSomethingWithNodes(nodes) {
    this.doSomething();
    var i; // HERE is where you move the 'var' to the top of the function
    for (i = 0; i < nodes.length; ++i) {
        this.doSomethingElse(nodes[i]);
    }

    doSomething(); // want to find this problem
}