Ошибка 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
}