инструмент качества кода JSLint

Поэтому я проверил свой javascript, используя это: http://www.jslint.com/

и если я не оборачиваю операторы IF/FOR между { }, я получаю такие "ошибки":

Проблема в строке 152, символ 27: ожидалось '{', а вместо этого было 'reset()'.

или если я инициализирую переменные внутри FOR, я получаю:

Проблема в строке 154, символ 19: Переместите объявления 'var' в начало функции.

Почему это считается ошибкой? Разве это не должно считаться хорошей практикой, потому что они фактически уменьшают размер кода, что для javascript даже важнее, чем скорость кода?


person Alexa    schedule 01.05.2011    source источник
comment
Почему размер кода важнее для Javascript, чем скорость кода?   -  person Pekka    schedule 01.05.2011
comment
@Pekka: Не следуя за вами, ни один из этих примеров не влияет на скорость кода.   -  person T.J. Crowder    schedule 01.05.2011
comment
потому что он не работает на сервере. А сделать скрипт, который тормозит на компьютере клиента, очень сложно, учитывая скорость современных компьютеров, поэтому скорость становится менее важной...   -  person Alexa    schedule 01.05.2011
comment
@Т.Дж. ОП утверждает, что размер кода важнее его скорости. Я хочу сказать, что не думаю, что это правда (или не понимаю причин, стоящих за этим)   -  person Pekka    schedule 01.05.2011
comment
@ Alexa Размер кода обычно не важен для скорости его выполнения - это определенно не лучшая парадигма для разработки кода. Учтите, что на большинстве HTML-страниц вы передаете изображения, в десятки или сотни раз превышающие размер всего вашего JavaScript вместе взятого.   -  person Pekka    schedule 01.05.2011
comment
@Pekka: А, хорошо, с тобой. И согласен, я бы сказал, что все было наоборот, поскольку интерпретаторы JavaScript в дикой природе имеют тенденцию быть немного медленными (я смотрю на вас, Microsoft), я бы предпочел коду требуется несколько дополнительных миллисекунд для загрузки, если он работает быстрее. :-)   -  person T.J. Crowder    schedule 01.05.2011
comment
Крокфорд с гордостью заявляет, что JSLint заденет ваши чувства.   -  person rohannes    schedule 01.05.2011
comment
вы правы это не имеет значения, но то же самое для скорости. На мой взгляд, размер js немного важнее, чем скорость js. Так что, если у вас есть 10K js вместо 11K js, это лучше, чем если бы у вас был js, который на 1-5-10% быстрее :)   -  person Alexa    schedule 01.05.2011
comment
@Rohannes - Вот почему это отстой. Крокфорд гордится тем, что люди потворствуют его убеждениям. Многие из его правил JSLint (второе выше — яркий пример) никак не влияют на качество кода. Это всего лишь мнение Крокфорда о том, как должен выглядеть ваш код, но из-за того, что он автоматизирован, люди думают, что их код недействителен, хотя на самом деле в нем нет ничего плохого.   -  person Karl Nicoll    schedule 01.05.2011
comment
Поскольку все переменные объявляются вместе в начале их области действия, это снижает вероятность ошибок области видимости (которые могут быть очень сложными для отладки), тем самым улучшая качество кода. Он здесь, чтобы помочь.   -  person rohannes    schedule 01.05.2011
comment
Учитывая недавний взлом goto fail, жаль, что все языки не используют фигурные скобки вокруг операторов if/for.   -  person David Sykes    schedule 27.03.2014


Ответы (6)


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

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

Лично я в настоящее время предпочитаю использовать JSHint, так как Crockfords Lint, на мой взгляд, меньше связан с правильным кодом, а больше — с Crockfords. мнение о том, как должен выглядеть JavaScript, к черту мнение всех остальных.

person Karl Nicoll    schedule 01.05.2011
comment
Крокфорд все чаще высказывал свое мнение пользователям JSLint, и теперь, на мой взгляд, зашел слишком далеко. Дело с var нелепо, как и с пометкой всех случаев использования == и != как ошибок без какой-либо возможности переопределения. Насколько мне известно, JSLint теперь непригоден для использования. - person Tim Down; 02.05.2011
comment
Теперь это меня успокаивает! Большая часть моего модульного кода не проходит через JSLint! +1 за JSHint! :D - person Rutwick Gangurde; 22.01.2013

JSLint рекомендует заключать операторы if и for в фигурные скобки, потому что это может привести к трудно отслеживаемым ошибкам, если вы не будете осторожны с отступами. Например:

if (somecondition)
    step1();
    step2();

Судя по отступам, шаги step1() и step2() будут выполняться только в том случае, если какое-то условие истинно, но на самом деле step2() будет выполняться всегда, поскольку фигурные скобки отсутствуют.

Если вас действительно беспокоит размер файла, я бы посоветовал изучить JS-компрессор, такой как yuicompressor. Большинство из них удалит фигурные скобки вокруг операторов if/for, которые в них не нуждаются. Тогда вы сможете получить лучшее из обоих миров: удобочитаемый код и небольшой размер файла при его обслуживании.

person Jeff Avallone    schedule 01.05.2011

Что касается второй проблемы, JSlint рекомендует ее, потому что переменные javascript всегда имеют область действия, а не область действия блока. Делая это:

function func(){
  var i;
  alert('foo');
  for(i = 0; i<3; i++){
     alert(i);
  }
  alert(i);
}

точно (100% точно!!) такой же, как:

function func(){
  alert('foo');
  for(var i = 0; i<3; i++){
     alert(i);
  }
  alert(i);
}

Таким образом, i не предназначен для (как и в других языках). Вот почему jslint рекомендует помещать все переменные поверх функций, чтобы вы не запутались, думая, что есть переменные с блочной областью видимости.

Уважаю первый вопрос, согласен с вами. Я не вижу в этом большой проблемы. Но JSLint видит в этом проблему, потому что, если вы позже добавите строки в свой оператор if и забудете поставить фигурные скобки, у вас будет логическая ошибка, как указал Джефф.

До:

if (x > 10)
    alert("it's obvious x is positive");

После некоторых изменений в коде:

if (x > 10)
    alert("it's obvious x is positive");  
    alert("x is greater than 10");  //Logic error

Проблема, которая не возникла бы при использовании фигурных скобок.

person Edgar Villegas Alvarado    schedule 01.05.2011

JSLint — это инструмент для качества кода, предназначенный для уменьшения количества ошибок. Вы знаете, что можете написать только один оператор в цикле if, не заключая его в фигурные скобки, но этот парень этого не делает. А что, если вы случайно сделаете это однажды?

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

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

В любом случае, просто игнорируйте ошибки, которые вам не нужны.

person Zirak    schedule 01.05.2011

Первое, фигурные скобки в операторах if, отражает убеждение автора JSLint, что отсутствие фигурных скобок приводит к проблемам с обслуживанием (вера, которую я разделяю, но это ни здесь, ни там).

Второй момент на самом деле зависит от языка: размещение var в любом месте, кроме верхней части области (функция или глобальная), на самом деле вводит в заблуждение любого, кто читает код, потому что независимо от того, где вы его поместите, это в точности так, как если бы это было в верхней части области. Подробности: Бедный, неправильно понятый var

person T.J. Crowder    schedule 01.05.2011
comment
Хотя ваша точка зрения о поднятии объявлений переменных верна, я не думаю, что это должно означать, что вы объявляете все свои переменные в верхней части функции. Я предпочитаю, чтобы объявление переменной было как можно ближе к первому использованию переменной для удобочитаемости, я не вижу в этом существенной проблемы и уверен, что делаю осознанный выбор, поэтому JSLint настаивает на этом без возможность переопределения делает его практически непригодным для меня. - person Tim Down; 02.05.2011
comment
@Tim: Да, именно по этой причине я не большой поклонник инструментов lint без параметров конфигурации. (Я категорически не согласен с var, но это просто стиль; делайте свои функции достаточно короткими, и это в любом случае не имеет большого значения.) Еще один из моих любимых вариантов из JSLint: 'function_name' использовался до того, как был определен . Это просто неправильно, если функция является декларацией ниже в области видимости. Функция определена недвусмысленно, но все равно жалуется... - person T.J. Crowder; 02.05.2011
comment
J. Я уже читал ваш пост в блоге о var и полностью понимаю аргументацию, но, как вы там говорите, нет абсолютно правильного и неправильного. Ваше возражение против того, что функция использовалась до того, как она была определена, мне любопытно: использование функции до ее объявления становится все более далеким от выражения того, что на самом деле происходит (поднятие), и поэтому кажется мне в значительной степени идентичным var вещь для меня. - person Tim Down; 02.05.2011
comment
@ Тим: я понимаю, что ты говоришь. Я предполагаю, что для меня различие - это ожидание. Я никогда не видел, чтобы кого-то смущал вызов функции до ее объявления, вероятно, потому, что большинство современных языков работают именно так. Однако я видел, как несколько человек были сбиты с толку var, и видел ошибки, вызванные этим. Следовательно, я бросаю Майклу кость в сообщение в блоге. :-) Опять же, функции должны быть короткими, и в любом случае их действительно немного. - person T.J. Crowder; 02.05.2011

Вы спросите: "Почему это считается ошибкой?" Это гораздо больше, чем плохая практика; они определенно вредоносны. Это потому, что они поощряют более поздние ошибки, которые будет почти невозможно найти. Такое же предсмертное опущение фигурных скобок разрешено и в C, и в C++, и там это такая же ошибка.

Если бы вы, как и я, пытались сэкономить пару нажатий клавиш, опуская фигурные скобки, а затем были укушены и избиты из-за своей ошибки, я обещаю, что вы бы не задавали этот вопрос :-)

person Pete Wilson    schedule 01.05.2011
comment
Брекеты, полностью согласен. Все переменные должны быть объявлены вверху: субъективные. Веские аргументы существуют для обеих сторон этого конкретного аргумента. Настаивать на этом без возможности переопределения — один из многих недостатков JSLint. - person Tim Down; 02.05.2011