Что-то я прям конкретно подсел на JavaScript, в частности на node.js. Значительно экономит время по сравнению со всем, что я до этого пробовал, да и от его объектной модели меня прям прёт.
При разработке на подобных языках отсутствует этап компиляции, в коде постоянно остаются косяки, которые всплывают только во время исполнения. И ладно, если ошибки всплывут при исполнении кода, обычно он всегда тестируется, но бывает и такое, что интерпретатор либо не видит явной ошибки, либо не хочет видеть (как к примеру делает хром со скриптами которые содержат даже синтаксические ошибки). Тут нас выручить может статический анализатор кода, чем и является JSHint.
Вкратце, его работа заключается в проверке кода, в соответствии с заданными правилами, до непосредственного исполнения кода.
Однако правила содержат не мало параметров, каждый из которых, я думаю, заслуживает внимания. Их описания на русском я нигде не нашёл, а на английском не всегда понятен их смысл, поэтому решил перевести, может кому-то, кроме меня, оно ещё будет полезным.
Сами правила можно записывать либо в конфигурационном файле, который будет влиять на проверку всего файла кода, либо в самом коде. В коде они записываются внутри комментариев, чтобы не мешались в рабочем коде. При этом, параметры можно указать внутри нужной области видимости, в пределах которой они и будут действовать, не влияя на остальной код. К примеру так:
/*jshint evil:true, boss:true */
function helloWorld() {
/*jshint expr:true */
}
Оригинал описания параметров находится тут. Перевод является достаточно вольным, но смысл, я надеюсь, донёс верно. При этом я не утверждаю, что со всеми фразами, сказанными ниже, я согласен.
Параметры с жёсткими ограничениями
Эти параметры указывают JSHint-у более строго проверять ваш код. Используйте их, если вы хотите разрешить использовать только безопасные конструкции языка. Это полезно, когда код пишется большим числом разработчиков с разным уровнем знаний.
- bitwise
Этот параметр запрещает использование побитовых операторов, такие как ^ (исключающее или), | (или) и другие. Могут быть две причины, по которым вы захотите включить этот параметр:
1. Т.к. JavaScript не имеет целочисленных переменных (только с плавающей точкой двойной точности), побитовые операторы с ними происходят очень медленно.
2. Побитовые операторы редко используются в программах на JavaScript, и зачастую, к примеру, & — это пропущенный символ в &&. - curly
Этот параметр заставляет всегда тело условий и циклов заключать в фигурные скобки. JavaScript позволяет опускать фигурные скобки, когда блок состоит только из одного оператора, к примеру:
while (day)
shuffle();
Однако, в некоторых случаях такая конструкция может привести к ошике:
while (day)
shuffle();
sleep(); // Можно подумать, что это часть цикла, но это не так.
Вообще, если вы аккуратно пишите код, то лучше всегда требовать обрамлять блоки скобками. - eqeqeq
Этот параметр запрещает использовать == и != в пользу === и !==. Эти операторы пытаются всегда приводить операнды к одному типу, в результате чего можно получить неожиданный результат. Последние не делают приведения, следовательно являются более безопасными. Если вы хотите узнать больше о приведении типов в JavaScript, рекомендуем ознакомиться с Truth, Equality and JavaScript (Angus Crol).
Примечание: даже если этот параметр выключен, JSHint все равно будет проверять небезопасное сравнение вида != null, если eqnull (см. ниже) включён! - forin
Этот параметр требует, чтобы во всех for in циклах выбирались только элементы объекта. Цикл for in перебирает все свойства объекта, в том числе и унаследованные. Это может привести к получению неожиданного свойства объекта. Обычно безопаснее фильтровать унаследованные свойства, например:
for (key in obj) {
if (obj.hasOwnProperty(key)) {
// Мы уверены, что obj[key] относится к текущему обхекту, а не унаследован.
}
}
Для лучшего понимания for in циклов в JavaScript, прочтите Exploring JavaScript for-in loops (Angus Croll). - immed
Этот параметр запрещает вызывать объявленную функцию, не обрамив ее скобками. При обрамлении скобками, становится понятно, что выражение — это результат функции, а не сама функция. - latedef
Этот параметр запрещает использование переменных до их объявления. JavaScrit позволяет объявлять переменные в любом месте, при этом, при исполнении кода, они все поднимаются в самый верх. Такое поведение может привести к непонятным ошибкам, поэтому использование этого параметра делает код более безопасным, разрешая использовать переменные только после их явного предварительного объявления.
Для лучшего понимания области видимости переменных и их объявлении в JavaScrip, прочтите JavaScript Scoping and Hoisting (Angus Croll). - newcap
Этот параметр требует обязательно использовать оператор new перед функциями — конструкторами. Тк функции — конструкторы объявляются как и обычные функции, есть возможность вызвать такую функцию на исполнение, вместо того, чтобы создать объект, это, зачастую, является ошибкой, в особенности, когда в теле функции присутствует this.
Отсутствие оператора new не вызовет никаких ошибок исполнения, и выявление такой ошибки будет затруднительным. А ошибка будет серьёзной, тк при вызове функции без оператора new, указатель this будет указывать не на создаваемый объект, а на глобальный.
Пример:
function MyConstructor() {
console.log(this);
}new MyConstructor(); // -> [MyConstructor]
MyConstructor(); // -> [DOMWindow]Для лучшего понимания, как работает this, прочтите Understanding JavaScript Function Invocation and «this» (Yehuda Katz). - noarg
Этот параметр запрещает использование arguments.caller и arguments.callee. При их использовании, становится невозможным использовать множество оптимизаций, поэтому они объявлены устаревшими в новых версиях JavaScript. Также EcmaScript 5 запрещает использовать argumants.callee в строгом режиме. - noempty
Этот параметр предупреждает, если в коде есть пустой блок. HSLint всегда делал такие предупреждения, мы сделали этот опциональным. В любом случае, не было случаев, чтобы пустой блок приводил к ошибке в программе. - nonew
Этот параметр запрещает вызывать конструктор, создавая объект, но нигде его не сохранив. Некоторые вызывают конструктор, не сохранив созданный объект в переменной, к примеру так:
new MyConstructor();
Такой подход не имеет смысла, поэтому вы должны избегать таких конструкций. - plusplus
Этот параметр запрещает использование унарных операторов инкремента и декремента. Некоторые считают, что использование ++ и — — это плохой стиль программирования, к примеру разработчики на Python, где такие операторы отсутствуют. - regexp
Этот параметр запрещает использовать . в регулярных выражениях, что может быть опасным. - undef
Этот параметр запрещает использовать не объявленные переменные. Этот параметр очень полезен, при поиске случаев, когда переменные создаются или используются глобально. Пример:
/*jshint undef:true */function test() {
var myVar = ‘Hello, World’;
console.log(myvar); // Здесь JSHint будет ругаться на неизвестную функцию
}Если переменная (функция) объявлена где-то в другом файле, то вы должны использовать конструкцию /*global … */ чтобы сообщить JSHint-у об этом. Польше информации ищите тут. - strict
Этот параметр требует, чтобы код был написан в соответствии с строгим режимом EcmaScript 5. Строгий режим запрещает использование некоторых конструкций JavaScript. При этом, строгий режим позволяет избежать появления некоторых ошибок и позволяет производить некоторые оптимизации кода.
Примечание: этот параметр использует строгий режим только внутри области видимости функции, и запрещает использовать его глобально, тк это может нарушить работу прочих компонентов. Если вы хотите использовать строгий режим глобально, воспользуйтесь параметром globalstrict. - trailing
Этот параметр будет выдавать ошибку в случае, когда у вас в конце строки есть пробелы. Такие пробелы могут стать источником ошибок в многострочном тексте, к примеру:
// Здесь действительно может возникнуть ошибка,
// если после \ будет стоять пробел
var str = «Hello \
World»;
Параметры с мягкими ограничениями
Эти параметры позволяют подавлять некоторые сообщения об ошибках. Используйте их только в том случае, когда вы полностью уверены в том, что делаете.
- asi
Этот параметр подавляет сообщения об ошибке, вызванной пропущенной точкой с запятой. Довольно много людей опасаются писать код без использования точки с запятой. Распространено мнение, что использование точки с запятой является обязательным в JavaScript (но это не так). JavaScript имеет свои правила по поводу использования точки с запятой, и их придерживаются все браузеры. Так что использовать этот параметр, или нет — это ваше дело.
Больше информации по использованию точки с запятой в JavaScript вы можете прочитать в An Open Letter to JavaScript Leaders Regarding Semicolons (Isaac Schlueter) и JavaScript Semicolon Insertion. - boss
Этот праметр подавляет сообщения об ошибке в случае, когда ожидается сравнение, но его не происходит. Чаще всего код вида if (a = 10) {} является опечаткой. Тем не менее, подобная конструкция может быть полехна в подобных случаях:
for (var i = 0, person; person = people[i]; i++) {} - debug
Этот параметр подавляет сообщения об ошибке, если в коде встречается ключевое слово debugger. - eqnull
Этот параметр подавляет сообщения об ошибке в случае использования сравнения вида == null. Такое сравнение может быть полезным, если вы хотите узнать, значение переменной null или undefined. - es5
Этот параметр сообщает JSHint-у, что ваш код использует возможности EcmaScript 5, такие как геттеры и сеттеры. Обратите внимание, что не все браузеры ещё поддерживают этот стандарт.
Больше информации:
1. ES5 compatibility table (Juriy Zaytcev)
2. ECMAScript 5 support in Mozilla - esnext
Этот параметр сообщает JSHint-у, что ваш код использует возможности ES.next, такие как const и let. Обратите внимание, что не все браузеры ещё поддерживают этот стандарт.
Больше информации:
1. Draft Specification for ES.next (ECMA-262 Ed. 6) - evil
Этот параметр подавляет сообщения об ошибке при использовании eval. Использовать eval не рекомендуется, тк он делает код уязвимым для различных инъекций, так же затрудняет работу оптимизаторам. - expr
Этот параметр подавляет сообщения об ошибке в случае, где обычно ожидается присваивание или вызов функции. Обычно такое случается в следствие опечатки, однако это не запрещается спецификацией. - funcscope
Этот параметр подавляет сообщения об ошибке в случае, когда переменная была объявлена в некоторой области видимости, а после запрашивается уже вне её. Вообще, в JavaScript существует как локальная область видимости, так и глобальная, подобная запись может привести в замешательство малоопытных разработчиков, также усложняет процесс отладки. JSHint выдаёт предупреждения, если используется переменная вне предполагаемой области видимости. Пример:function test() {
if (true) {
var x = 0;
}x += 1; // ‘x’ используется вне предполагаемой области объявления.
// предупреждение не будет выведено, если выставить funcscope:true
} - globalstrict
Этот параметр подавляет сообщения об ошибке в случае использования строгого режима глобально. Глобальный строгий режим может не пропустить сторонний код, написанный в обычном режиме.
Больше информации вы можете получить прочитав о параметре strict. - iterator
Этот параметр подавляет сообщения об ошибке в случае использования свойства __iterator__. Это свойство поддерживается не всеми браузерами, и пользоваться им нужно с осторожностью. - lastsemic
Этот параметр подавляет сообщения об ошибке при отсутствии точки с запятой в выражении, если оно записано с блоком в одну строку. Пример:
var name = (function() { return ‘Anton’ }());
Это удобно использовать в случае автоматической генерации JavaScript кода. - laxbreak
Этот параметр подавляет большинство сообщений об ошибке в коде, где есть подозрения на неправильно записанную строку. Но при этом не подавляются предупреждения при использовании first-style написании кода (см laxcomma). Пример:
var foo = «blah blah»
+ «blah blah»; - laxcomma
Этот параметр подавляет сообщения об ошибке при first-style написании кода. Пример:
var obj = {
name: ‘Anton’
, handle: ‘valueof’
, role: ‘SW Engineer’
}; - loopfunc
Этот параметр подавляет сообщения об ошибке при объявлении функций внутри циклов. Такие объявления могут приводить в подобным ошибкам:
var nums = [];for (var i = 0; i < 10; i++) {
nums[i] = function (j) {
return i + j;
};
}nums[0](2); // выводиться 12 вместо 2Исправить ошибку можно копируя i при объявлении функции:
var nums = [];for (var i = 0; i < 10; i++) {
(function (i) {
nums[i] = function (j) {
return i + j;
}
}(i));
} - multistr
Этот параметр подавляет сообщения об ошибке при при использовании «многострочных» строк текста. Многострочный текст может быть опасными в случае, если после экранирующего символа в конце строки (\) попадёт пробел.
Хотя этот параметр перестаёт выводить предупреждения при использовании многострочного текста, при возникновении ошибки (пробел после экранирующего символа, либо отсутствие его совсем), сообщение будет выведено.
Пример:
/*jshint multistr:true */var text = «Hello\
World»; // Все отлично.text = «Hello
World»; // Предупреждение — нет экранирующего символа.text = «Hello\
World»; // Предупреждение — пробел после экранирующего символа (подсветить нечем, но он там есть 🙂 ) - onecase
Этот параметр подавляет сообщения об ошибке при использовании единственного варианта выбора в конструкции switch. Обычно, в таких случаях можно обойтись обычным условием, однако такая ситуация часто возникает при автоматической генерации кода. - proto
Этот параметр подавляет сообщения об ошибке при использовании свойства __proto__. Это свойство объявлено устаревшим и больше не поддерживается браузерами. - regexdash
Этот параметр подавляет сообщения об ошибке, если используется не экранированный — в конце регулярного выражения. - scripturl
Этот параметр подавляет сообщения об ошибке при использовании строки URL со скриптом, какой как javascript:…. - smarttabs
Этот параметр подавляет сообщения об ошибке при использовании для отделения блоков кода пробелов и табуляторов вперемешку. Такая техника называется SmartTabs. - shadow
Этот параметр подавляет сообщения об ошибке при объявлении переменной, которая уже была объявлена во внешней области видимости. - sub
Этот параметр подавляет сообщения об ошибке при использовании нотации [] при обращению к свойствам объекта, когда это свойство возможно получить с использованием точечной нотации. Те person[‘name’] или person.name. - supernew
Этот параметр подавляет сообщения об ошибке при использовании странных конструкций, типа new function () { … } и new Object;. Однако такие конструкции иногда используются при создании объектов «одиночек», к примеру:
var singleton = new function() {
var privateVar;this.publicMethod = function () {}
this.publicMethod2 = function () {}
}; - validthis
Этот параметр подавляет сообщения об ошибке при возможных нарушениях строгого режима. Использование этого параметра возможно в области видимости функции, которая работает в строгом режиме.
Примечание: параметр нужно использовать только внутри функции. При попытке использовать его глобально, JSHint завершится с ошибкой.
Параметры среды исполнения.
Эти параметры позволяют предварительно определить глобальные переменные используемых библиотек, браузера или node.js. По сути они являются аналогами объявлений вида /*global $:false, jQuery:false */.
- browser
Этот параметр объявляет глобальные объекты современных браузеров, такие как document и navigator, а также объекты HTML5 типа FileReader и другие.
Примечание: параметр не объявляет переменные типа alert или console. Для этого используется параметр devel. - couch
Этот параметр объявляет глобальные объекты CouchDB. CouchDB — это документоориентированная база данных, данные из которой могут быть запрошены с использованием MapReduce, используя JavaScript. - devel
Этот параметр объявляет глобальные объекты, которые обычно используются для отладки (console, alert). Как правило, они не должны присутствовать в готовом коде. - dojo
Этот параметр объявляет глобальные объекты для Dojo Toolkit. - jquery
Этот параметр объявляет глобальные объекты для jQuery — библиотеки
JavaScript. - mootools
Этот параметр объявляет глобальные объекты для MooTools — JavaScript фреймворка. - node
Этот параметр объявляет глобальные объекты для кода, исполняемого внутри node.js. Node.js — это серверная имплементация языка JavaScript, которая использует асинхронную событийную модель. - nonstandard
Этот параметр определяет не стандартные, но часто используемые глобальные объекты, такие как escape и unescape. - prototypejs
Этот параметр объявляет глобальные объекты для Prototype — JavaScript фреймворка. - rhino
Этот параметр объявляет глобальные объекты для кода, исполняемого внутри Rhino. Rhino — это реализация JavaScript, написанная на Java с открытым исходным кодом. - wsh
Этот параметр объявляет глобальные объекты, используемые в коде, написанном для Windows Script Host.
Параметры, оставшиеся по историческим причинам.
Эти параметры остались от JSLint. Эти параметры не будут дорабатываться, и в далнейшем могут быть удалены.
- nomen
Этот параметр запрещает использовать _ в именах переменных. Мы не знаем, нафига это нужно. - onevar
Этот параметр позволяет использовать только один var в теле функции. Некоторые уверены, что использование одного var в коде улучшает его наглядность. Пример (код для JSHint/JSLint):
x.nud = function () {
var b, f, i, j, p, seen = {}, t;b = token.line !== nexttoken.line;
if (b) {
indent += option.indent;
if (nexttoken.from === indent + option.indent) {
indent += option.indent;
}
}// […]
}; - passfail
Этот параметр останавливает проверку дальнейшего кода, при появлении первой ошибки или предупреждения. - white
Этот параметр позволяет делать проверку кода на соответствие стилю, который предлагает Douglas Crockford’s. Но, к сожалению, в его книге «The Good Parts» это плохо документировано.