Подтвердить что ты не робот

Имеет ли смысл использовать JSLint и следовать ему?

В последнее время я писал JS-код, используя jQuery и JavaScript, как есть, и я подумал, что попробую JSLint попробовать. Позвольте мне сказать, что код содержит различные функции и jQuery, и он отлично работает (без ошибок) в IE8 и последнем Firefox. Код также validatas как XHTML 1.0 Transitional (и Строгий тоже, но я в основном хочу, чтобы он был Transitional действительным).

Однако, с 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 и понять его, я буду признателен.

Если нет, объясните, используете ли вы это или нет, и советуете ли вы его использовать или нет.

UPDATE:

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

4b9b3361

Ответ 1

То, что следует помнить при использовании JSLint, заключается в том, что на основе мнения о том, что один человек считает "хорошими частями".

Я думаю, что это отличный инструмент, но есть правила, с которыми я не согласен.

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

С использованием символьной записи Array [] по сравнению с конструктором Array, я согласен, существуют различия, которые могут привести к тому, что два синтаксиса будут отличаться, например:

 [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 оцениваются до выполнения кода -a hoisting - и они инициализируются с помощью 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;

To:

id+=1;
array[id] = x;

Что более понятно, но в любом случае в случае оператора for IMO он вообще не может вызвать путаницу...

О последнем "['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

Ответ 2

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

Я избегаю предупреждения тега script, не работая с файлами html. Я использую jslint систематически на .js файлах, но не на html. Я считаю, что просто слишком обременительно объявить все глобальные идентификаторы, которые были определены во встроенных скриптах, но не отображаются в jslint.

Книга Крокфорда "Javascript: The Good Parts" объясняет многие, если не все предупреждения jslint, а некоторые из них основаны на предполагаемой склонности к ошибкам. Предупреждение 'new Array()' vs '[]' основано на отвращении Дага к "новому" оператору. Опускание "нового" для разных конструкторов - это обычно действующий код, но не правильный код, и использование альтернативного синтаксиса позволяет избежать этого риска.

Ошибка "слишком много варов" означает именно это: большое количество объявлений "var" в данной функции: одобренный Crockford стиль заключается в использовании одного или нескольких объявлений "var", все в верхней части функции, Вы можете объявить несколько переменных в одном выражении var, разделив их запятыми.

Предупреждение "++" - это другое предупреждение, основанное на багах; Использование "+ = 1" означает одно и то же, и Дуг полагает, что он менее подвержен ошибкам.

jslint, таким образом, представляет собой смешанный пакет. Некоторые функции (locals vs globals) бесценны, некоторые (script типы) просто раздражают, и многие из них сомнительны, но безвредны.

jQuery сам передает проверки jslint, как описано здесь: http://docs.jquery.com/JQuery_Core_Style_Guidelines#JSLint

Ответ 3

Там была старая шутка про программиста, который курил. Друг сказал: "Ты очень умный парень, разве ты не можешь прочитать предупреждение о пакете, в котором говорится, что сигареты убьют тебя?" Пришел ответ: "Я программист, мы обращаем внимание только на ошибки, а не на предупреждения".

Иногда JSLint сообщает вам, что критически важно, иногда это просто приколы. Вы можете потеряться, пытаясь сделать его счастливым, но вы можете просто потеряться без него. Как и любой другой инструмент, его вход должен приниматься с солью. Я предпочитаю думать об этом как о проверке орфографии или грамматике в MS Word. Иногда это правильно, иногда это неправильно, и иногда мне просто все равно, что это говорит мне.

Ответ 4

JSLint - это инструмент Качество кода. Это не похоже на валидатор W3C. Рассмотрите это как еженедельный обзор кода в компании. Соглашения о кодировании различаются, и JSLint является лишь одним из них. Могут быть те точки, с которыми вы не согласны, но если вы работаете в команде , и вам нужно управлять большей базой кода, JSLint может стать спасателем жизни. Зачем? Потому что он предупреждает вас о вещах, которые запутывают или подвержены ошибкам.

Лучший способ использовать JSLint: прочитать все, что он говорит, и если вы unsure о чем-то правильно, как это было предложено (как кажется здесь).

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

И если вы хотите знать, что аргументы за предложениями смотрят видео Douglas Crockford на Javascript.

Наконец, вы можете отключить фильтры, которые вы считаете бесполезными.

Ответ 5

Больно, когда вы начинаете использовать его в своем старом коде.

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

Еще одно преимущество - когда вы начинаете сжимать свой javascript. Если вы пройдете проверку JSLint, вы почти наверняка сжимаете без проблем.

При этом jquery имеет 23 предупреждения, большинство из которых касается регулярных выражений, но широко используется без каких-либо проблем.

Ответ 6

вы должны использовать его. Тот факт, что он работает в одном браузере, не означает, что он будет работать во всех браузерах; некоторые из них более снисходительны, чем другие. например, наличие конечной запятой в массиве будет ломаться в IE, но работать в FF.

Помните, что иногда вы получаете массу ошибок, но вы удаляете первую и десятую часть, например, компилируете код.

вы можете сделать

var rows = [];

для первой ошибки.

Ответ 7

Вот лучшие ответы, которые я могу дать. Возможно, кто-то может заполнить некоторые пробелы. Похоже, что все это относится к 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 like

Я считаю, что для современных браузеров нет необходимости в text/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++) {

Не уверен в этом, за исключением того, что если я правильно помню, Crockford не нравится ++ и --.


Problem at line 64 character 50: ['PrettyId'] is better written in dot notation.

var item = $("#item_" + data["PrettyId"]);

Я считаю, что обозначение . предпочтительнее, потому что оно короче и быстрее (в некоторых браузерах). Итак, data.PrettyID.

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