Есть ли смысл использовать JSLint и следовать ему? [закрытый]
В последнее время я писал некоторый код JS, используя jQuery и JavaScript, как это есть, и я думал, что дам JSLint попробовать. Позвольте мне сказать, что код содержит различные функции и использование jQuery, и он прекрасно работает (без каких-либо ошибок ) в IE8 и последнем Firefox.
Код также валидатас как переходный XHTML 1.0 (и строгий тоже, но я в основном хочу, чтобы он был переходным валидным).
Однако с JSLint как будто все не так. Хотя я читал о том, что она очень строгая, даже если я повернусь только на "хороших частях" это все равно как 70+ ошибок в типичной HTML-странице.
Он начинается с этого (зачем мне удалять тип, чтобы сделать Мои документы XHTML недействительными??)
Problem at line 5 character 67: type is unnecessary.
<script src="/Scripts/jquery-1.4.2.min.js" type="text/javascript"></script>
И продолжает с эзотерическими ошибками, такими как
Problem at line 41 character 41: Use the array literal notation [].
var rows = new Array();
Problem at line 42 character 30: Too many var statements.
for (var i = 0; i < data.length; i++) {
Problem at line 42 character 55: Unexpected use of '++'.
for (var i = 0; i < data.length; i++) {
Problem at line 64 character 50: ['PrettyId'] is better written in dot notation.
var item = $("#item_" + data["PrettyId"]);
Если кто-нибудь может дать мне ответы на эти ошибки и особенно, как заставить JSLint быть осведомленным о jQuery и понять его, я буду признателен.
Если нет, пожалуйста, объясните, используете ли вы его или нет и используете ли вы его. совет использовать его или нет.
Обновление:
Я собираюсь подождать еще один день для получения дополнительных ответов, если таковые имеются, тогда я приму ответ с наибольшим количеством апвотов.
7 ответов:
При использовании JSLint нужно помнить, что он построен на мнении о том, что один человек считает "хорошими частями".
Я думаю, что это отличный инструмент, но есть правила, с которыми я не согласен.Об атрибуте
typeвы можете узнать больше о мнении автора здесь он говорит, что атрибут "обязательный и необязательный", но если вы подтверждаете свои документы, вам это явно нужно.С использованием массивной литеральной нотации
[]vs. конструктор массива, я согласен, есть различия, которые могут заставить два синтаксиса вести себя по-разному, например:Итак, для последовательности и краткости лучше использовать буквальное обозначение.[5]; // one-element array ["5"]; // one-element array new Array(5); // empty array but its length is initialized with 5 new Array("5"); // one-element arrayЧто касается "слишком много операторов var", JavaScript не имеет блочной области, область находится на функциональном или глобальном уровне, и все операторы
varоцениваются перед выполнением кода-он же подъем - и инициализируются с помощьюundefined, в то время как назначения выполняются на уровне во время выполнения.Например:
var x = 0; if (true) { var x = 1; // useless var, x already declared } x; // 1И "подъем" объявления переменной можно показать в этом примере:
var x = 5; // global (function () { alert(x); // alerts `undefined`, x declared but unassigned in this scope alert(y); // ReferenceError, y is undeclared var x = 10; })();Как вы можете видеть,
xудерживаетundefined, поскольку он объявлен до фактического выполнения кода, операторыvarподнимаются в верхнюю часть своей заключительной области:var x = 5; // global (function () { var x; alert(x); // alerts `undefined`, x declared but unassigned alert(y); // ReferenceError, y is undeclared x = 10; // assignment is made })();Таким образом, это правило хочет на самом деле сделать код похожим на то, что произойдет, все операторы
varна первом месте.О "неожиданном использовании'++'", это еще одно правило, которое мне не совсем нравится, автор считает, что"те способствуют плохому коду, поощряя чрезмерную хитрость".
Когда я использую их в некотором выражении, я пытаюсь извлечь использование оператора в отдельный оператор, например:
array[++id] = x;Кому:
id+=1; array[id] = x;Что более понятно, но в любом случае в случае утверждения
forИМО это не может вызвать никакой путаницы вообще...О последнем "['PrettyId'] лучше писать в точечная нотация.", JSLint ожидает, что использование скобочной нотации будет "динамическим", он ожидает увидеть там выражение, а не строковый литерал, содержащий допустимое имя идентификатора, скобочная нотация должна использоваться только тогда, когда вы хотите получить доступ к свойству с именем, которое конфликтует с зарезервированным словом, например:
data.function; // SyntaxError in ECMAScript 3 based implementations data["function"]; // OkИли когда свойство содержит символы, которые не являются допустимым идентификатором, например:
data.foo-bar; // it access the property `foo` minus a `bar` variable data["foo-bar"]; // Ok data.foo bar; // SyntaxError, unexpected `bar` identifier data["foo bar"]; // Ok
Я использую jslint on .JS файлы и найти комбинацию опций и исправлений, чтобы сделать его счастливым. Я считаю, что это улучшает качество моего кода. Я бы рекомендовал запустить его, даже если вы используете его только для изоляции пропущенных объявлений 'var'.
Я избегаю предупреждения тега script, не работая с html-файлами. Я использую JSLint систематически .файлы js, но не на html. Я нахожу, что слишком обременительно объявлять все глобальные идентификаторы, которые были определены в включенных сценариях, но не видны jslint.
Книга Крокфорда "Javascript: хорошие части" объясняет многие, если не все предупреждения jslint, и некоторые из них основаны на восприятии пронзительности ошибок. Предупреждение 'new Array ()' vs '[] 'основано на отвращении дуга к оператору' new'. Пропуск "new" для различных конструкторов обычно является допустимым кодом, но не корректным кодом, и использование альтернативного синтаксиса позволяет избежать этого риска.
Ошибка "слишком много var" означает именно это, большое количество объявлений " var " в данном функция: одобренный Крокфордом стиль заключается в использовании одного или нескольких объявлений 'var', все в верхней части функции. Можно объявить несколько переменных в одном операторе var, разделив их запятыми.
Предупреждение " ++ "- это еще одно предупреждение, основанное на предрасположенности к ошибкам; использование "+=1 " означает то же самое, и Дуг считает, что оно менее подвержено ошибкам.
Jslint, таким образом, является смешанным мешком. Некоторые особенности (местные жители против глобальных переменных) просто бесценны, некоторые (типа скрипт) просто раздражает, и многие сомнительной пользы, но безвредной.
JQuery сам проходит проверку jslint, как описано здесь: http://docs.jquery.com/JQuery_Core_Style_Guidelines#JSLint
Есть старая шутка о программисте, который курил. Друг сказал: "Ты действительно умный парень, разве ты не можешь прочитать предупреждение на пачке, что сигареты убьют тебя?"Пришел ответ:" я программист. Мы обращаем внимание только на ошибки, а не на предупреждения."
Иногда JSLint говорит вам вещи, которые являются критическими, иногда он просто ворчит. Вы можете заблудиться, пытаясь сделать его счастливым, но вы можете просто быть потерянным без него. Как и любой другой инструмент, его вход должен быть взят с зерном из соли. Я предпочитаю думать об этом как о проверке орфографии или грамматики в MS Word. Иногда это правильно, иногда неправильно, а иногда мне просто все равно, что он говорит.
Больно, когда вы начинаете использовать его в своем старом коде.
Но тогда это сэкономит вам много времени.
JSLint может обнаружить много проблем, которые вы увидите только при обновлении страницы или хуже, когда это делают ваши пользователи.
теперь мне больно, когда я должен использовать редактор без JSLintЕще одно преимущество заключается в том, что вы начинаете сжимать javascript. Если вы пройдете проверку JSLint, вы почти наверняка будете сжиматься без проблем.
Как говорится, jquery имеет 23 внимание, большинство из них о регулярных выражениях, но широко используется без каких-либо проблем.
JSLint-это инструменткачества кода . Это не похоже на валидатор W3C. Считайте это чем-то вроде еженедельного обзора кода в компании. Соглашения о кодировании различаются, и JSLint является лишь одним из них. Могут быть моменты, с которыми вы не согласны, но если вы работаете в команде и вам нужно управлять более крупной кодовой базой, JSLint может быть спасением жизни. Почему? Потому что он предупреждает Вас о вещах, которые сбивают с толку или склонны к ошибкам.
Лучший способ использовать JSLint: прочитайте все, что он говорит, и если вы не уверены в чем-то правильном, как это предлагается (как это, кажется, имеет место здесь).
Причина в том, что JSLint предназначен для предотвращения путаницы, и если вы используете что-то, что может привести к ошибкам, и вы не знаете, почему, то вам лучше выбрать четкую альтернативу.
И если вы хотите знать, что стоит за этими предложениями, посмотрите видео Дугласа Крокфорда на Javascript.
Наконец, вы можете отключить найденные фильтры. бесполезный.
Вы должны использовать его. Тот факт, что он работает в одном браузере, не означает, что он будет работать во всех браузерах; некоторые из них более снисходительны, чем другие. например, наличие конечной запятой в массиве будет нарушать IE, но работать в FF.
Имейте в виду, что иногда вы получаете тонну ошибок, но вы удаляете первую и дюжина уходит, как компиляция кода.
Вы можете сделать
var rows = [];Для первой ошибки.
Вот лучшие ответы, которые я могу дать. Возможно, кто-то сможет заполнить некоторые пробелы. Это не так, как будто любое из них касаются, хотя в jQuery, не.
Также смотрите этот документ для некоторых пояснений.
Я считаю, что для современных браузеров нет необходимости вProblem at line 5 character 67: type is unnecessary. <script src="/Scripts/jquery-1.4.2.min.js" type="text/javascript"></script> and goes on with esoteric errors liketext/javascriptпри ссылке на внешние JS-файлы.
Problem at line 41 character 41: Use the array literal notation []. var rows = new Array();Рекомендуетсяне вызывать конструктор при создании объекта или массива. Честно говоря, я не знаю почему. Кто-нибудь?
Problem at line 42 character 30: Too many var statements. for (var i = 0; i < data.length; i++) {Я полагаю, что у вас есть переменная
i, объявленная в другом месте в той же области. Блок javascript не создает область видимости, поэтому если у вас есть другой циклfor(например), который используетi, он использует ту же переменную. Нет необходимости объявлять об этом снова.
Problem at line 42 character 55: Unexpected use of '++'. for (var i = 0; i < data.length; i++) {Не уверен насчет этого, за исключением того, что, если я правильно помню, Крокфорд не любит
++и--.
Problem at line 64 character 50: ['PrettyId'] is better written in dot notation. var item = $("#item_" + data["PrettyId"]);Я считаю, что
Насколько я могу судить, здесь нет ничего явно неправильного. В основном просто советы по лучшей практике с точки зрения создателя JSLint..нотация предпочтительнее, потому что она короче и быстрее (во всяком случае, в некоторых браузерах). Так чтоdata.PrettyIDвместо этого.
Comments