사용자 도구


JSHint

자바스크립트 코드 검사 도구

설치

$ sudo npm install jshint -g

사용법

먼저 프로젝트 폴더에 .jshintrc 파일을 생성한다. 그 후 아래와 같이 편집한다.

{
  "undef": true,
  "unused": true,
}

JSON 형식으로 작성하면 된다. “옵션명” : 사용여부 형식으로 작성한다. 그 후 아래 명령으로 코드를 검사한다.

$ jshint [파일명]

금지(Enforcing) 옵션

코딩 스타일을 강제하기 위한 옵션이다.

bitwise ^(XOR), | 같은 bit연산자를 금지한다.
camelcase 변수를 카멜케이스(혹은 UPPER_CASE)로 강제한다(이름은 카멜케이스이지만 var test나 var Test모두 가능하다.)
curly if문이나 while문 등 중괄호({})를 생략해도 되는 곳에서 중괄호를 강제한다.
eqeqeq 비교문에서 ==나 !=대신 ===나 !==를 사용하도록 강제한다.
es3 구형브라우저를 위해서 es3 명세를 사용한 경우에 필요하다.
forin for-in 루프를 사용할 때 반드시 필터링을 사용하도록 강제한다. for (var key in obj)식의 루프에서 프로토타입 체인을 사용한 키를 다 순회하므로 일반적으로 if (obj.hasOwnProperty(key)) {}같은 조건문을 두는데 이러한 필터링이 없을 경우(꼭 hasOwnProperty여야 하는 건 아니다.) 오류가 나오도록 한다. (루프문안에 다른 실행문이 없으면 무시한다.)
freeze Array, Date, String 같은 네이티브 객체의 프로토타입을 덮어쓸 수 없도록 막는다. Array.prototype.count = function() { };와 같이 사용하는 경우 오류 메시지가 나온다.
immed var a = function() {}();와 같이 함수를 바로 실행하는 경우 함수를 괄호로 감싸도록 강제한다. 이는 가독성을 높이기 위함이다.
indent 들여쓰기 크기를 정하고 숫자로 지정한다.
latedef 변수를 사용하는 하는 부분 뒤에 정의하는 것을 금지한다. 자바스크립트는 hoisting 때문에 같은 스코프에서 나중에 선언된 변수를 앞에서 사용할 수 있는데 이 부분을 차단한다는 의미이다.
newcap new로 생성자 함수를 사용할 때 대분자로 시작하도록 강제한다. new animal(); 대신 new Animal();와 같이 사용해야 한다.
noarg 최적화가 어려워 폐기될 예정인 arguments.caller와 arguments.callee의 사용을 막는다.
noempty for (var i=0;i < 10;i++) { }와 같이 for문 등에서 빈 블록을 금지한다.
nonew new Animal();같은 생성자함수의 실행결과를 다른 변수 등에 할당하지 않고는 사용할 수 없게 한다.
plusplus ++, –같은 단항연산자를 금지한다.
quotmark 문자열 등에 사용하는 따옴표의 스타일을 강제한다. true로 지정하면 쌍따옴표, 홑따옴표를 모두 쓸 수 있지만 섞어서 사용할 경우 오류가 나고 single은 홑따옴표 double는 쌍따옴표를 강제한다.
undef 선언되지 않은 변수를 사용하면 오류가 발생한다.
unused 변수를 선언하고 사용하지 않으면 오류가 발생한다.
strict 함수에 ECMAScript 5의 strict mode를 강제한다. 이 옵션은 함수범위에만 강제하고 전역 strict mode는 허용하지 않는다.
trailing 라인 끝에 불필요한 공백문자가 들어가면 오류가 발생한다.
maxparams 값을 숫자로 지정하고 함수에서 파라미터의 최대 개수를 지정한다.
maxdepth 제어문의 최대 중첩개수를 지정한다.
maxstatements 한 함수내의 사용할 수 있는 최대 스테이트먼트 개수를 지정한다.
maxcomplexity 코드의 사이클매틱 복잡도(cyclomatic complexity)를 지정한다.
maxlen 한 라인의 최대 길이를 지정한다.

완화(Relaxing) 옵션

안전하지 않은 코드에 대한 오류를 허용하기 위한 옵션이다.

asi 세미콜론이 빠졌을 때 발생하는 오류를 보여주지 않는다.
boss if (a = 1)처럼 비교문이 와야 할 곳에 할당문이 올 때 발생하는 오류를 보여주지 않는다.
debug debugger;문을 코드에 사용했을 때 발생하는 오류를 보여주지 않는다.
eqnull == null 비교에 대한 오류를 보여주지 않는다.
esnext ECMAScript 6 문법을 사용을 허용한다.
evil eval을 사용했을 때 발생하는 오류를 보여주지 않는다.
expr 함수 호출이나 할당문이 아닌 표현식에 대한 오류를 보여주지 않는다. 주로 테스트에서 true.should.be.ok;같은 표현식을 사용할 때 필요하다.
funcscope if (true) { var a = 1; }처럼 제어문 내에서 변수를 정의하는 경우 발생하는 오류를 보여주지 않는다. 자바스크립트는 펑션스코프를 사용하므로 동작에는 이상이 없지만, 오류를 발생할 여지가 있으므로 이 방법을 권장하지 않는다.
globalstrict ECMAScript 5의 strict mode를 전역으로 사용하는 것을 허용한다.
iterator iterator 프로퍼티 사용에 대한 오류를 보여주지 않는다.
lastsemic 한 줄짜리 블록에서 마지막 세미콜론이 빠진 경우에만 오류를 보여주고 블록 내부 등에서 세미콜론을 사용하지 않은 경우에는 오류를 보여주지 않는다.
laxbreak 코드에서 안전하지 않은 줄 바꿈에 대한 오류를 보여주지 않는다. 이 오류는 콤마를 앞에 쓰는 형식에 대한 오류도 보여주지 않는데 이 경우에는 laxcomma를 사용해야 한다.
laxcomma 객체 리터럴등에서 콤마를 앞에(마지막이 아니라) 쓰는 형식을 허용한다.
loopfunc 루프 안에서 함수를 정의하는 경우 발생하는 오류를 보여주지 않는다.
moz 모질라의 자바스크립트 확장 문법(JavaScript 1.7)을 사용하도록 허용한다.
multistr \를 사용해서 문자열을 여러 라인에 걸쳐서 사용하는 경우 발생하는 오류를 보여주지 않는다.
notypeof typeof의 값을 비교할 때 typeof의 값이 아닌 값과 비교하는 경우 발생하는 오류를 보여주지 않는다.
proto proto 프로퍼티 사용에 대한 오류를 보여주지 않는다.
scripturl <a href=“javascript:”>처럼 스크립트를 타켓으로 한 URL(javascript:)에 대한 오류를 보여주지 않는다.
smarttabs 탭과 스페이스를 섞어서 사용하는 경우 발생하는 오류를 보여주지 않는다.
shadow 이미 선언된 변수를 재선언해서 발생하는 variable shadowing에 대한 오류를 보여주지 않는다.
sub obj['key']대신 .을 사용하는 표기법을 권장하는 오류를 보여주지 않는다.
supernew new function () {}나 new Object;처럼 잘못 작성했을 가능성이 있는 생성자에 대한 오류를 보여주지 않는다.
validthis strict 모드로 동작할 때 생성자가 아닌 함수에서 this를 사용하는 것에 대한 오류를 보여주지 않는다.

환경

JSHint가 알려진 라이브러리의 전역변수들을 알게끔 하기 위한 옵션이다.

browser 최신 브라우저들의 document, navigator같은 전역 변수를 정의한다. 이 옵션은 console, alert은 노출하지 않는다.
couch CouchDB의 전역변수를 정의한다.
devel console, alert등 개발용으로 사용하는 전역 변수/객체를 정의한다.
dojo Dojo의 전역변수를 정의한다.
jquery jQuery의 전역변수를 정의한다.
mootools MooTools의 전역변수를 정의한다.
node Node.js환경에 맞도록 브라우저 환경에만 어울리는 오류는 무시하고 Node.js에 맞는 전역변수를 정의한다.
nonstandard escape나 unescape처럼 표준은 아니지만, 범용적으로 쓰이는 전역변수를 정의한다.
phantom PhantomJS에서 동작하는 환경에 맞는 전역변수를 정의한다.
prototypejs Prototype의 전역변수를 정의한다.
rhino Rhino 환경에 맞는 전역변수를 정의한다.
worker Web Worker 환경에 맞는 전역변수를 정의한다.
wsh Windows ScriptHost 환경에 맞는 전역변수를 정의한다.
yui YUI의 전역변수를 정의한다.

레거시 옵션

Deprecated 된 옵션이다. 사용금지.

nomen 변수의 앞이나 뒤에 언더스코어(_)를 사용한 경우 오류가 발생한다.
onevar 함수 안에 var 선언을 하나만 해야 한다.
passfail 이 옵션을 사용하면 첫 오류나 경고에서 멈춘다.
white JSHint가 더글라스 크록포드(Douglas Crockford)의 코딩 스타일가이드에 따라 코드를 검사하도록 한다.

참고