JSHint 选项
这里介绍了JSHint的完整选项列表,如果你发现有任何选项缺失,请创建一个bug或者发邮件。
1. Enforcing选项
当下列选项设置为true,JSHint会基于这些选项对代码产生更多的警告信息。
1.1 bitwise
这个选项禁止在javascript中使用位运算符,如 ^ (XOR), | (OR)。在javascript中位运算很少见,&与&&经常容易混淆,大多数情况下应该使用&&。
1.2 camelcase
这个选项允许代码块中的变量名用驼峰式或者用下划线连接的全大写.
1.3 curly
这个选项要求在循环和条件判断的代码块中总是使用大括号包围,即使是单行代码,否则极易引起错误:
javascript允许在单行语句的情况下不使用大括号,如下例所示:1
2while (day)
shuffle();
然而,在某些情况容易导致bug,比如:1
2
3while (day)
shuffle();
sleep();
我们会认为sleep()方法是while循环内部的代码,但事实上它并不是。
1.4 eqeqeq
这个选项禁止使用==和!=,而是===和!==。前者会在比较之前强制类型转换,这样会导致一些无法预期的结果;而后者不会,所以更安全。 如果想了解更多关javascript强制类型的,请参考Truth, Equality and JavaScript by Angus Croll.
1.5 es3
这个选项指当前代码严格最受ECMAScript 3规范,一般当javascript程序需要在IE6、IE7、IE8或者其它遗留的javascript运行环境中工作时需要用到这个选项。
1.6 forin
这个选项要求所有的forin循环过滤对象的items。forin语句允许依据对象的所有属性名称进行循环,包括从protopy链中集成来的属性,这个行为可以导致一些在代码中没有期望的属性出现,所以一般在使用forin的时候需过滤掉继承的属性。如下例:1
2
3
4
5 for (key in obj) {
if (obj.hasOwnProperty(key)) {
// We are sure that obj[key] belongs to the object and was not inherited.
}
}
想深入了解forin循环,请参见 Exploring JavaScript for-in loops by Angus Croll.
1.7 immed
这个选项禁止使用没有括号的调用函数的方法。函数加括号意味着这段代码是执行方法的返回结果,而非方法本身,减少一些阅读的困惑。
1.8 indent
indent选项强制代码使用特定的tab宽度,例如下面代码会报indent警告信息。
1 | /*jshint indent:4 */ |
1.9 latedef
latedef选项是关于变量的声明与使用的先后顺序,它禁止变量没有定义就使用。javascript只有函数作用域,另外,javascript解析时所有的变量都回被搬到或者提升到函数的最顶端,这种行为会导致一些很tricky的bug,所以在变量定义后在使用总是安全的。
将latedef的选项值设为”nofunc”允许忽略函数的声明。深入研究,请参见JavaScript Scoping and Hoisting by Ben Cherry.
1.10 newcap
newcap要求将构造函数的名字大写,这只是一种convention,标志这些函数将会用new操作符构建对象,用以区分其它的函数类型,避免一些错误。
不这么做也没什么问题,但是会对代码的理解增加一些难度,同时如果本来应该用new构建但却没有new,可能会使得变量指向全局对象而不是一个new的对象。
1.11 noarg
noarg禁止在javascript代码中使用arguments.caller and arguments.callee. 这些调用阻止了javascript一批量的优化措施变,在新版本的规法中已经将它门定义为过时,实际上ECMAScript 5已经禁止在严格模式下使用这两种方式。
1.12 noempty
noempty当发现代码有空的代码块是会发出警告信息。
1.13 nonew
nonew禁止使用构造函数,因为它会带来一些不必要的副作用。一些程序员喜欢调用构造函数,但并不将它的结果赋予任何变量。
new MyConstructor();
这种方式没有与简单的MyConstructor()相比没有什么优势,因为用new操作符创建的对象没有被任何地方使用。
1.14 plusplus ++
plusplus禁止使用一元递增和递减的操作符,有些人认为++ –会降低代码风格的质量,也有人认为使用++ –有性能上的优化。
1.15 quotmark
quotmark强制项目代码的引用保持一致,它介绍三个值,true, single and double。true指不想引入任何一种具体的引号风格,但想保持一致。single指单引号,double指只允许双引号。
1.16 undef
undef禁止使用显示的未声明的变量,这个选项在寻找泄露以及输入错误的变量时很有用。
1 | /*jshint undef:true */ |
如果所使用的变量在另一个文件中定义,可以使用/global … / directive来声明。
1.17 unused
unused会在发现定义了但为被使用的变量时报警告信息。当要进行代码清理的时候特别有用,常与undef一起使用。
1 | /*jshint unused:true */ |
另外,它也可以警告关于没有用到的global变量。它的值可以设为”vars”,只检查变量,不包括函数参数或者严格的只检查变量和参数。缺省位true,允许未使用的参数后面跟一个使用过的参数。
1.18 strict
strict要求所有函数遵循ECMAScript 5的严格模式。严格模式消除了一些javascript易混淆的痛点,修复了一些阻碍javascript引擎进行优化的错误。
严格模式只在函数作用域生效,禁止全局范围的严格模式,因为会破坏第三方依赖的代码,如果一定要使用,请参见globalstrict选项。
1.19 trailing
trailing当发现代码的尾部有空行会报错。尾部有空格会导致一些tricky的bug,尤其是在多行字符串的情况下。1
2
3
4// This otherwise perfectly valid string will error if
// there is a whitespace after \
var str = "Hello \
World";
1.20 maxparams
maxparams可以设置一个函数最多允许的参数个数1
2
3
4
5
6
7
8
9
10/*jshint maxparams:3 */
function login(request, onSuccess) {
// ...
}
// JSHint: Too many parameters per function (4).
function logout(request, isManual, whereAmI, onSuccess) {
// ...
}
1.21 maxdepth
maxdepth允许控制代码的嵌套层次。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15/*jshint maxdepth:2 */
function main(meaning) {
var day = true;
if (meaning === 42) {
while (day) {
shuffle();
if (tired) { // JSHint: Blocks are nested too deeply (3).
sleep();
}
}
}
}
1.22 maxstatements
maxstatements允许设置一个函数最多允许的有效代码行数。
1 | /*jshint maxstatements:4 */ |
1.23 maxcomplexity
maxcomplexity允许控制代码的圈复杂度。圈复杂度测量代码中独立路径的数量,请参见cyclomatic complexity on Wikipedia.
1.24 maxlen
maxlen允许设置移行的最大长度。
2. Relaxing options
当下面这些选项设为true,将会减少警告信息的产生。
2.1 asi
asi选项针对javascript代码的分号问题,有很多人认为应该严格的在行尾添加分号,更多信息请参见An Open Letter to JavaScript Leaders Regarding Semicolons by Isaac Schlueter and JavaScript Semicolon Insertion.
2.2 boss
经常在代码中会出先应该是用条件判断的地方出现了赋值语句,boss选项设为true会隐藏这些错误信息。
2.3 eqnull
eqnull与null比较相关,如果设为true,在看到==null操作时不会报错。
2.4 esnext
esnext要求代码使用ECMAScript6规范语法。注意这个feature还没有最后确定并且不是所有的浏览器都实现。
Draft Specification for ES.next (ECMA-262 Ed. 6)
2.5 evil
evil隐藏eval使用的警告。eval的使用使得代码有了被攻击的缺陷,并且阻碍了javascript解析器的一些优化措施。
2.6 expr
expr隐藏了关于expressions异常使用的代码,通常期待赋值或者函数定义而出现的expression往往是一种错误,但规范中并没有禁止此种使用方式,所以对这种代码只是警告信息。
2.7 funcscope
funcscope是关于变量的作用域问题,有些变量在控制结构内声明,然而在之外企图访问。尽管javascript只有两种作用域,函数作用域与全局作用域,然而这种跨作用域的使用方式会对javascript的初学者造成困惑,并很难调试,缺省JSHint会对这种使用提示警告信息。
1 | function test() { |
2.8 globalstrict
globalstrict隐藏了全局作用域使用严格模式的警告信息,它可能会到第三方代码的功能破化,所以不推荐使用,参见strict选项。
2.9 iterator
iterator隐藏了iterator属性的警告信息,并不是所有浏览器都支持,所以使用要首先确认支持的浏览器。
2.10 lastsemic
lastsemic只针对在只有一行的代码块的最后一行,如果缺失分号缺省会报警告信息;如果lastsemic设为true,即隐藏了这类的警告信息。
1 | var name = (function() { return 'Anton' }()); |
2.11 laxbreak
laxbreak隐藏了可能不安全的换行代码。对于以逗号分隔的代码参见laxcomma。
2.12 laxcomma
laxcomma针对逗号开头的代码风格。
1 | var obj = { |
2.13 loopfunc
loopfunc针对循环内定义function的代码块。
1 | var nums = []; |
使用闭包可解决以上问题,此时nums[i]的i是for循环i的一个复本。1
2
3
4
5
6
7
8
9var nums = [];
for (var i = 0; i < 10; i++) {
(function (i) {
nums[i] = function (j) {
return i + j;
};
}(i));
}
2.14 moz
moz声明代码使用mozilla javascript扩展。
2.15 multistr
关于多行字符串的。多行字符串是很危险的,如果不小心在转义符或者换行符之间插入了一个空格,那么代码就被破坏了。
1 | /*jshint multistr:true */ |
2.16 proto
关于 proto 属性.
2.17 scripturl
关于script-trageted URLS,诸如javascript: …
2.18 smarttabs
smarttabs隐藏当空格用来对齐,tab和空格混用的代码。
2.19 shadow
指在不同作用域重复定义 变量,特指在外层作用域已经定义了,在小作用域内定义会shadow外层的变量。
2.20 sub
sub提示需要用.访问属性而不是[],例如 person[‘name’] vs. person.name.
2.21 supernew
隐藏关于一些器官的构造方式,诸如new function(){…}和new Object。这些代码块在一些场合下用来创建单例对象。
1 | var singleton = new function() { |
2.22 validthis
validathis只在函数作用域内生效,隐藏了违反严格模式使用标准的代码,或则在非构造函数中使用this。
3 Environments
下列选项是关于一些预定以的全局变量。