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

Почему JQuery не передает JSLint?

Возможный дубликат:
Что хорошего в JSLint, если jQuery не удалось проверить

http://code.jquery.com/jquery-1.4.4.js

Перейдите туда и вставьте его на www.jslint.com

Является ли Jquery не допустимым.

4b9b3361

Ответ 1

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

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

посмотрим на них один за другим:

Проблема в строке 231 символ 20: Ожидаемый '===' и вместо этого увидел '=='.

return num == null?

Здесь jquery использует == on null для проверки как undefined, так и null. Поскольку jQuery используется как внешняя библиотека, он не может гарантировать, будет ли вход, который мы передаем в функции, будет undefined или null. Это безопаснее для проверки и того, и другого.

Выполнение num === undefined || num === null для удовлетворения JSLint смешно.

Проблема на строке 446 персонажа 29: Ожидалось условное выражение и вместо этого увидел назначение.

while ((fn = ready [i ++])) {

Здесь JSLint жалуется на назначение вместо проверки равенства. Причина, по которой JSLint выбрасывает эту ошибку, состоит в том, что ее общий тип type = вместо == по ошибке. Назначение в этом цикле while сделано для того, чтобы сделать код более аккуратным.

Проблема в строке 550 символ 9: Пусто блок.

var key; for (ключ в obj) {}
return key === undefined || hasOwn.call(obj, key);

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

Проблема в строке 554 character 15: Move Объявления 'var' в верхней части функция.

для (имя var в obj) {

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

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

Проблема символа линии 792 42: '& &' подвыражение должно быть завернуто в parens.

ua.indexOf( "compatible" ) < 0 & & rmozilla.exec(ua) ||

Я лучше согласен с этим (ua.indexO("compatile") < 0) &&.

Проблема в строке 872 символ 3: Переместить вызов в parens, который содержат функцию.

})();

Для замыканий типа:

(function() {

})();
//}());

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

Проблема символа линии 972 13: 'e' уже определено.

} catch (e) {

Parser жалуется на повторное использование переменной e В этом случае мы знаем, что e будет использоваться только локально в этом блоке catch, поэтому не имеет значения, изменим ли мы его за пределами блока catch. Здесь я предпочитаю читаемость повторного использования имени переменной e

Проблема в строке 1097 символ 21: Ожидаемый '===' и вместо этого увидел '=='.

elem = elem == window?

Хорошо, ты поймал меня на этом. Я обрушился на то, почему jQuery не использует === на window

Проблема в строке 1621 символ 24: Ожидаемое назначение или функция вызывать и вместо этого видеть выражение.

parent.selectedIndex;

// Safari mis-reports the default selected property of an option
// Accessing the parent selectedIndex property fixes it
if ( name === "selected" && !jQuery.support.optSelected ) {
    var parent = elem.parentNode;
if ( parent ) {
    parent.selectedIndex;

Вот одна из ошибок кросс-браузера, которые могут быть исправлены, но вызывает плохие code

Проблема символа линии 977 17: Отсутствует "break" после "case".

case "last":

JSLint говорит, что вы всегда должны ломаться после своих дел. Это совершенно верно, чтобы провалиться после случая. В большинстве случаев вы забыли break, но здесь это намеренно.

Проблема в строке 1099 character 77: Ожидаемое назначение или функция вызывать и вместо этого видеть выражение.

Array.prototype.slice.call( document.documentElement.childNodes, 0 ) [0].node...

// Perform a simple check to determine if the browser is capable of
// converting a NodeList to an array using builtin methods.
// Also verifies that the returned array holds DOM nodes
// (which is not the case in the Blackberry browser)
try {
    Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType;

Источник здесь говорит сам за себя. Это странный оператор, но если доступ к нему, как это, вызывает ошибку, то его можно поймать. Это все еще справедливо, только JSLint сообщает вам: "Вы действительно хотели это сделать?"

Проблема в строке 2377 символ 15: Плохо в переменной "name".

для (имя в параметрах) {

Здесь JSLint жалуется на использование name, который может конфликтовать с window.name в глобальной области. Это "не совсем зарезервированное ключевое слово будущего, но его следует избегать". Были в закрытом состоянии, так что это безопасно.

Проблема в строке 2486 символ 29: слишком много ошибок. (60% отсканировано).

Внутренний стек JSLint не может справиться с этим. Я сейчас остановлюсь.

Я думаю, что смысл проиллюстрирован.

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

Ответ 2

Правила, используемые jslint, являются рекомендациями, а не нерушимыми правилами. Есть много причин, по которым вы можете игнорировать некоторые из них.

Существует довольно много подробных соображений правил jslint; многие люди не согласны с этим.

Лично мне это нравится, но используйте комментарии в верхней части каждого JS файла, чтобы включать и выключать различные предупреждения, когда я знаю, что то, что я делаю, является подходящим. Затем мы запускаем jslint против всех наших JS как часть тестов CI, и он иногда ловит несколько тривиальных ошибок, не обременяя нас вообще.