1、概述
jshint是检测JavaScript语法问题的工具,能够根据本身的须要配置检测规则。node
2、安装
npm install jshint -g
通常全局安装就能够了,能够在任何目录下使用jshint命令。npm
3、简单的使用方法
一、检测单个js文件语法
在myfile.js所在的目录运行:
jshint myfile.js
二、检测当前目录及其子目录全部js文件的语法
jshint ./json
4、配置文件
有如下三种方法设置jshint配置文件
一、使用 –config 选项指定配置文件
Example:
jshint –config ./aaa ./
表示检测当前目录内全部的js文件,并指定配置文件为当前目录下的aaa文件。
二、使用 .jshintrc 文件,若是在运行jshint是,若是没有–config 选项,则会以当前目录的.jshintrc文件为配置文件,若是当前目录没有这个文件,则以其父目录.jshintrc 文件配置文件,仍没有的话,则继续找其父目录,直至根目录。
三、在nodejs项目的package.json文件的jshintConfig字段中设置配置文件。数组
5、内嵌配置
除了使用配置文件配置检测规则外,还能够在js文件内,使用特殊的注释,配置检测规则。
Example:
/* jshint undef: true, unused: true */
/* global MY_GLOBAL */
或者
// jshint undef: true, unused: true
这两种注释方式都是能够的,其中global参数告诉JSHint,该变量是全局变量,从其余js引入的。并且这些注释的做用域是函数内,这意味着若是你把这段注释放在某个函数内,则该配置只在该函数内起做用。安全
6、JSHint的配置选项
asi
若是是真,JSHint会无视没有加分号的行尾,
自动补全分号一直是Javascript颇有争议的一个语法特性。默认,JSHint会要求你在每一个语句后面加上分号,可是若是你认为本身理解了asi(automatic semicolon insertion),你能够抛弃JSHint对分号的检查。闭包
bitwise
若是为真,JSHint会禁用位运算符
Javascript容许位运算,可是他却没有整型,位运算符要把参与运算的数字从浮点数变为整数,并在运算后再转换回来。这样他们的效率就不如在别的语言中那么高。curl
boss
很霸气的选项,若是为真,那么JSHint会容许在if,for,while里面编写赋值语句。
通常来讲,咱们会在循环、判断等语句中加入值的比较来作语句的运行条件,有时候会把==错写成赋值的=,一般,JSHint会把这个认定为一个错误,可是开启这个选项的化,JSHint就不会检查判断条件中的赋值 ,你是boss,你说的算:)。函数
curly
若是为真,JSHint会要求你在使用if和while等结构语句时加上{}来明确代码块。
Javascript容许在if等结构语句体只有一句的状况下不加括号。不过这样作可能会让你的代码读起来有些晦涩。工具
debug
若是为真,JSHint会容许代码中出现debugger的语句。不过建议你最好在检测代码前去掉debug的语句。this
eqeqeq
若是为真,JSHint会看你在代码中是否都用了===或者是!==,而不是使用==和!=。
咱们建议你在比较0,”(空字符),undefined,null,false和true的时候使用===和!===。
eqnull
若是为真,JSHint会容许使用”== null”做比较。
== null 一般用来判断一个变量是undefined或者是null(当时用==,null和undefined都会转化为false)。
evil
若是为真,JSHint会容许使用eval
eval提供了访问Javascript编译器的途径,这有时颇有用,可是同时也对你的代码造成了注入攻击的危险,而且会对debug形成一些困难。
记住,Function构造函数也是另外一个‘eval’,另外,当传入的参数是字符串的时候,setTimeout和setInterval也会相似于eval。
forin
若是为真,那么,JSHint容许在for in 循环里面不出现hasOwnProperty,
for in循环通常用来遍历一个对象的属性,这其中也包括他继承自原型链的属性,而hasOwnProperty能够来判断一个属性是不是对象自己的属性而不是继承得来的。
immed
若是为真,JSHint要求匿名函数的调用以下:
(function(){
//
}());
而不是
(function(){
//bla bla
})();
laxbreak
若是为真,JSHint则不会检查换行。
Javascript会经过自动补充分号来修正一些错误,所以这个选项能够检查一些潜在的问题。
maxerr
设定错误的阈值,超过这个阈值jshint再也不向下检查,提示错误太多。
newcap
若是为真,JSHint会要求每个构造函数名都要大写字母开头。
构造器是一种使用new运算符来建立对象的一种函数,new操做符会建立新的对象,并创建这个对象本身的this,一个构造函数若是不用new运算符来运行,那么他的this会指向全局对象而致使一些问题的发生。
noarg
若是为真,JSHint会禁止arguments.caller和arguments.callee的使用
arguments对象是一个类数组的对象,它具备一个索引值。arguments.callee指向当前执行的函数(这个在ES5的严格模式中被禁用了),而arguments.caller指向调用当前函数的函数(若是有的话),而且,他并非在全部的Javascript实现里面都有。
noempty
若是为真,JSHint会禁止出现空的代码块(没有语句的代码块)。
若是为真,JSHint会禁用构造器,以免一些问题。
在JSLint中会主动禁用构造器的方式以免一些潜在问题,但其实不少构造器的使用并不是有害,例如以下的调用
new JsUIWindow();
//注意这个调用是没有把构造器的结果赋值给变量的
所以,咱们须要使用构造器的时候能够禁用这个选项。
nomen
若是为真,JSHint会禁用下划线的变量名。
不少人使用_name的方式来命名他们的变量,以说明这是一个私有变量,但实际上,并非,下划线只是作了一个标识。
若是要使用私有变量,可使用闭包来实现。
onevar
若是为真,JSHint指望函数只被var的形式声明一遍。
passfail
若是为真,JSHint会在发现首个错误后中止检查。
plusplus
若是为真,JSHint会禁用自增运算和自减运算
++和–可能会带来一些代码的阅读上的困惑。
regexp
若是为真,JSHint会不容许使用.和[^…]的正则,
由于这样的正则每每会匹配到你不指望的内容,并可能会应用形成一些危害。
undef
若是为真,JSHint会要求全部的非全局变量,在使用前都被声明。
若是你不在一个本地做用域内使用var的方式来声明变量,Javascript会把它放到全局做用域下面。这样会很容易引发错误。
sub
若是为真,JSHint会容许各类形式的下标来访问对象。
一般,JSHint但愿你只是用点运算符来读取对象的属性(除非这个属性名是一个保留字),若是你不但愿这样能够关闭这个选项。
strict
若是为真,JSHint会要求你使用use strict;语法。
Strict 模式是ES5里面的一个新特性,他容许你把一个程序或者函数放在一个“严格”的做用域中。可见Resig写的一篇关于严格模式的blog
严格模式作了几件事情,
一、他能够捕获一些错误和异常
二、当咱们进行一下“不安全”的操做时,他会抛异常,例如访问全局变量。
三、他会禁止你使用一些奇淫技巧,或者不良的代码编写。
white若是为true,JSHint会依据严格的空白规范检查你的代码。