С кодом будь строг. Настройка jshint
Сейчас использую, и лучшего не видел jshint. До него я работал с js2-mode для emacs и его более продвинутой версией, с jshint от дядюшки Крокфорда. jshint использую в качестве плагина к sublimetext2. Чтобы начать пользоваться им
Остановлюсь на настройках и на случаях, которые они покрывают. Мой файл настроек можно взять тут. Что такое .jshintrc можно прочитать в документации
Негодует при использовании arguments.calle, arguments.calle.caller (см. strict mode).
Теперь у вас в руках остро наточенный инструмент, который позволит не задумываться над синтаксисом, а сконцентрироваться на логике.
- надо установить node.js
- через package control установить SublimeLinter
- покрутить настройки до удовлетворяющего уровня
Остановлюсь на настройках и на случаях, которые они покрывают. Мой файл настроек можно взять тут. Что такое .jshintrc можно прочитать в документации
curly : true
Заставляет ставить фигурные скобки даже тогда, когда они не обязательны. С одной стороны улучшается читаемость кода, с другой, при простейшей обфускации код продолжает корректно работать.if (ready())
onready();
else
on_not_ready();
// VS
if (ready()) {
onready();
} else {
on_not_ready();
}
eqeqeq : true
Контролирует использование строгого сравнения. Выигрыш получается не только в производительности (он мизерный на самом деле), а в чуть большей прозрачности кода (не надо задумываться о том, какого типа данные хранятся в переменных). Подробнее про автоматическое приведение типов при нестрогом сравнении.['1'] == 1; // true
['1'] === 1; // false
month === '7'; // очевидно, что month содержит строку
forin : true
Ошибочным считает перебор свойств объекта без проверки hasOwnProperty (этого метода нет в ie7). Особенно полезно создателям 3-d party библиотек или встраиваемых скриптов. Подобная проверка ограничит код от удовлетворенных порывов к monkey patching.immed : true
Обязывает оборачивать моментально вызываемые функции в скобки. Таким образом читающему становится ясно, что фишка в вызове функции, а не в ее определении (при этом ясно как читая с начала, так и с конца определения).latedef : true
Обращает внимание на вызов функций перед их определением. Хотя это и естественная практика (так как определением функций происходит на этапе чтения кода, и функции уже объявлены на этапе интерпретации), для не знающего тонкостей ecma, подобная запись будет сюрпризом.newcap : true
Стимулирует использование заглавных первых букв в именах конструкторов.noarg : true
Негодует при использовании arguments.calle, arguments.calle.caller (см. strict mode).
noempty : true
Не приемлет использование пустых блоков кода. Чаще всего такие конструкции связаны с ошибкой или опиской.if (document) {} // вероятнее всего описка
plusplus : true
Поощряет использование += и -= вместо ++ и --. Запись чуть длиннее, зато понятно что происходит и в каком порядке.undef : true
Присвоение неопределенной переменной выдаст ошибку. В нестрогом режиме в таком случае создает глобальная переменная (см. strict mode).asi : false
Принуждает к расстановке точек с запятой. Стандарт говорит, что точку с запятой ставить не обязательно, интерпретатор самостоятельно их расставит. Правда сделать это он может неоднозначно. Код ниже приведет к ошибке из-за отсутствия точки с запятой после объявления объекта. Подобную неожиданность можно встретить при конкатенации файлов, при длинном объявлении объекта или при большом расстоянии между объявлением объекта и вызовом функции (в виде комментария, например). Одно из решений — всегда ставить точку с запятой перед вызовом анонимной функции.var obj = {
prop : 'val'
}
(function () {
// полезная функция
}()); // ошибка
funcscope : false
Возбраняет использование функций и переменных, объявленных в лексических областях видимости. Для новичка не прозрачно то, что все вар-ы создаются на этапе чтения скрипта. К тому-же на сегодняшний момент код ниже генерирует ошибку в фаерфоксе.if (true) {
function a () {}
} else {
function b () {}
}
b();
Теперь у вас в руках остро наточенный инструмент, который позволит не задумываться над синтаксисом, а сконцентрироваться на логике.