JSHint. Повышаем качество JavaScript кода.

Что-то я прям конкретно подсел на 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» это плохо документировано.

Добавить комментарий