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

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/

 Ben Roberts22 июн. 2012 г., 17:39
JSHint - хороший выбор.
 Paul Beusterien03 февр. 2011 г., 17:34
@ Давид Для меня да.
 James Wiseman10 янв. 2011 г., 13:15
Можете ли вы задать свой вопрос. Вы на самом деле задаете два вопроса?
 vsync25 июн. 2011 г., 16:33
этот сайт будет работать лучше ->glat.info/jscheck
 david01 февр. 2011 г., 23:11
Останавливается ли это на первой ошибке, если вы убрали галочкуStop on first error?

Ответы на вопрос(7)

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

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

/*jslint vars: true */

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

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

 JavaKungFu08 янв. 2013 г., 23:32
@jjrv У вас есть пример кода, который не работает с компилятором закрытия? Я использую это и не видел никаких проблем.
 JavaKungFu09 янв. 2013 г., 16:04
О, хорошо, я неправильно понял ваш ответ, я думал, что это на самом деле создало проблему в скомпилированном коде. Благодарю.
 Lee Kowalkowski13 нояб. 2012 г., 22:13
Да неужели?! Жаль, но очень полезно поделиться +1.
 jjrv09 янв. 2013 г., 09:33
@JavaKungFu симптомом было то, что компилятор сообщает о менее чем 100% набранном коде и выдает предупреждение, если вы установили reportUnknownTypes = CheckLevel.WARNING в CompilerOptions.java.

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

 Shanimal03 окт. 2013 г., 04:06
Я использую lodash, но отличный момент.
Решение Вопроса

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

Например: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 потому что, кажется, сосредоточиться на важных вещах.

 Lee Kowalkowski09 сент. 2015 г., 15:52
@Zon: или просто использоватьi опять как любой здравомыслящий разработчик. Неважно, где вы объявляетеvar i, повторное использование допускается независимо.
 user105233521 сент. 2012 г., 16:15
Спасибо за указание наjavascriptlint.com/online_lint.php, Я использовал JSLint, но трудно разобраться со всеми бессмысленными болтовнями об ошибках, которые даже не являются ошибками в JSLint.
 mastaBlasta18 мар. 2013 г., 14:54
Я не согласен с вами, но важно отметить, что JavaScript имеет только область действия. У него нет области блока в цикле for. Поэтому даже если переменнаяi определяется вfor(var i=0; i<10; i+=1) он будет доступен для всей функции и будет поднят наверх при инициализации. JSLint синтаксически корректен, но в этом случае, по соглашению, никто не кодирует таким образом.
 mastaBlasta19 мар. 2013 г., 18:48
NVM ты абсолютно прав. Я тестировал, чтобы увидеть, что произойдет, если у вас есть две петли в функцииfor(var i=0; i<5; i+=1), если компилятор броситvariable already defined предупреждение, но это не так! Даже в строгом режиме повторное объявление переменной не выдало предупреждений или ошибок. Так что да, JSLint не так.
 Ben Roberts22 июн. 2012 г., 17:25
Также проверьте JSHint, который был создан частично в ответ на подобные вещи в JSLint. И посмотрите это обсуждение:stackoverflow.com/questions/6803305/...

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
}

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

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

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

Ваш ответ на вопрос