Ошибка JSLint: переместить все объявления 'var' в начало функции - PullRequest
77 голосов
/ 10 января 2011

Сайт 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 для тестирования кода, потому что он останавливает сканирование скрипта на эту ошибку.

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

ОБНОВЛЕНИЕ 22.08.2011: найдено http://jshint.com, выглядит намного лучше, чем http://jslint.com/

Ответы [ 7 ]

151 голосов
/ 20 июня 2011

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

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


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

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

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

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

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

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

7 голосов
/ 30 июня 2012

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

5 голосов
/ 02 февраля 2011

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

Обратите внимание, что предупреждение было введено как часть основного перезаписи и возникает только после for(, поэтому сообщение немного вводит в заблуждение.

4 голосов
/ 02 февраля 2011

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

3 голосов
/ 29 августа 2011

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

1 голос
/ 10 июня 2015

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

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

/*jslint vars: true */

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

0 голосов
/ 29 апреля 2016

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

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
}
...