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


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

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

обновление

пример:

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 76

7 ответов:

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

/*jslint vars: true */

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

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

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
}