├── README.md ├── enforcing_options.md ├── environments_options.md ├── legacy_options.md └── relaxing_options.md /README.md: -------------------------------------------------------------------------------- 1 | JSHint文档汉化版 2 | ================= 3 | 4 | ## 一. 使用方式 5 | 6 | ### 1. 作为Node程序使用 7 | 8 | (1)安装jshint 9 | 10 | $ npm install jshint -g 11 | 12 | (2)命令行下用jshint检查目标文件 13 | 14 | $ jshint file.js 15 | 16 | 备注:目标文件可以有多个,文件名之间以空格分开 17 | 18 | (3)例子 19 | 20 | // 目标文件test.js的内容 21 | /* jshint unused: true */ 22 | var a = 1; 23 | var b = 2; 24 | alert(b); 25 | 26 | // 命令行下检查test.js 27 | $ jshint test.js 28 | 29 | // 命令行下输出的检查结果 30 | test.js: line 2, col 6, "a" is defined but never used. 31 | 32 | 1 error 33 | 34 | 35 | ## 三. JSHint options 36 | 37 | JSHint有两种类型的options: 38 | 39 | * enforcing -- 它们使JSHint更加严格,[详细介绍](enforcing_options.md); 40 | 41 | * relaxing -- 它们用来抑制一些警告,[详细介绍](relaxing_options.md). 42 | 43 | -------------------------------------------------------------------------------- /enforcing_options.md: -------------------------------------------------------------------------------- 1 | JSHint enforcing options 2 | ================= 3 | 4 | #### * bitwise 5 | 6 | 作用:值为true时,禁止使用位操作符,如"^,|,&"等. 7 | 8 | #### * camelcase 9 | 10 | 作用:值为true时,变量名必须使用驼峰风格(如"loginStatus")或UPPER_CASE风格(如"LOGIN_STATUS"). 11 | 12 | #### * curly 13 | 14 | 作用:值为true时,不能省略循环和条件语句后的大括号. 15 | 16 | 备注:如"if (con) ...",需要写成"if (con) { ... }". 17 | 18 | #### * eqeqeq 19 | 20 | 作用:值为true时,禁止使用"=="和"!=",而应该使用"==="和"!==". 21 | 22 | #### * es3 23 | 24 | 作用:值为true时,表示你的代码需要遵守ECMAScript 3规范. 25 | 26 | #### * forin 27 | 28 | 作用:值为true时,在所有"for in"循环中,必须使用hasOwnPropery过滤掉对象继承来的成员. 29 | 30 | #### * immed 31 | 32 | 作用:值为true时,调用立即执行的函数必须使用括号包裹. 33 | 34 | 示例: 35 | // 这样会报错 36 | var f = function () { 37 | // ... 38 | }(); 39 | 40 | // 必须这样 41 | var f = (function () { 42 | // ... 43 | })(); 44 | 45 | #### * indent 46 | 47 | 作用:该选项要求你的代码必须使用指定的tab缩进宽度,如"indent:4". 48 | 49 | #### * latedef 50 | 51 | 作用:值为true时,禁止在变量定义之前使用它. 52 | 53 | #### * newcap 54 | 55 | 作用:值为true时,构造函数名需要大写. 56 | 57 | 备注:经测试,该选项是否激活,JSHint都不会检查构造函数名. 58 | 59 | #### * noarg 60 | 61 | 作用:值为true时,禁止使用arguments.caller与arguments.callee. 62 | 63 | #### * noempty 64 | 65 | 作用:值为true时,不允许代码中出现空的语句块("{}"). 66 | 67 | #### * nonew 68 | 69 | 作用:值为true时,禁止使用产生副作用的构造器调用方式,如"new MyConstructor();". 70 | 71 | #### * plusplus 72 | 73 | 作用:值为true时,禁止使用一元递增("++")和递减("--")运算符. 74 | 75 | #### * quotmark 76 | 77 | 作用:该选项用于统一代码中的引号风格,可选的值有三个: 78 | (1) single -- 只能使用单引号; 79 | (2) double -- 只能使用双引号; 80 | (3) true -- 两者任选其一,但不能同时出现. 81 | 82 | #### * undef 83 | 84 | 作用:值为true时,禁止使用未定义的变量. 85 | 86 | #### * unused 87 | 88 | 作用:该选项激活后,对于"已定义却未使用的变量"会给出警告,可选的值有三个: 89 | (1) vars -- 只检查变量,不检查函数形参; 90 | (2) strict -- 检查变量和函数形参; 91 | (3) true -- 检查变量和函数形参,但允许这种情况:一个未使用的形参后紧随一个被使用的形参. 92 | 93 | 示例:strict与true的区别 94 | (1) strict 95 | function show(x,y) {alert(y);} // jshint校验结果:'x' is defined but never used 96 | show(1); 97 | 98 | (2) true 99 | function show(x,y) {alert(y);} // jshint校验结果:pass 100 | show(1); 101 | 102 | #### * strict 103 | 104 | 作用:值为true时,该选项会要求所有函数在ECMAScript 5的严格模式中运行. 105 | 106 | 备注:该选项激活后,仅在函数作用域中启用严格模式(如果在全局作用域中启用,可能会影响页面中的第三方JS). 107 | 108 | #### * trailing 109 | 110 | 作用:值为true时,禁止在代码的末尾出现空白. 111 | 112 | #### * maxparams 113 | 114 | 作用:该选项用于设置每个函数形参数量的上限,如"maxparams:3". 115 | 116 | #### * maxdepth 117 | 118 | 作用:该选项用于设置每个函数中代码块嵌套层级的上限,如"maxdepth:1". 119 | 120 | 示例:/* jshint maxdepth:1 */ 121 | function show() { 122 | if (1) { 123 | if (2) { // jshint校验结果:Blocks are nested too deeply. (2) 124 | alert('the second nested'); 125 | } 126 | } 127 | } 128 | 129 | #### * maxstatements 130 | 131 | 作用:该选项用于设置每个函数中语句数量的上限,如"maxstatements:4". 132 | 133 | 备注:函数声明被看作一个语句. 134 | 135 | 示例:/* jshint maxstatements:4 */ 136 | function main() { // jshint校验结果:This function has too many statements. (5) 137 | var i = 0; 138 | var j = 0; 139 | 140 | // 函数声明被看作一个语句 141 | function inner() { 142 | var i2 = 1; 143 | var j2 = 1; 144 | return i2 + j2; 145 | } 146 | 147 | j = i + j; 148 | return j; 149 | } 150 | 151 | #### * maxcomplexity 152 | 153 | 作用:一言难尽. http://en.wikipedia.org/wiki/Cyclomatic_complexity 154 | 155 | #### * maxlen 156 | 157 | 作用:该选项用于设定每行的最大字符长度. 158 | -------------------------------------------------------------------------------- /environments_options.md: -------------------------------------------------------------------------------- 1 | # JSHint environments options 2 | 3 | 说明:这些选项用于预定义来自流行JS库(如JQuery)和运行时环境(如Node)中的全局变量. 4 | 5 | #### * browser 6 | 7 | 作用:该选项定义了现代浏览器暴露出来的全局变量(不包括alert和console),true -- 启用,false -- 关闭. 8 | 9 | 示例:未启用 10 | /* jshint browser:false */ 11 | var elem = document.getElementById('#aa'); // JSHint校验结果:'document' is not defined. 12 | 13 | #### * couch 14 | 15 | 作用:该选项定义了CouchDB暴露出来的全局变量,true -- 启用,false -- 关闭. 16 | 17 | #### * devel 18 | 19 | 作用:该选项定义了用于调试的全局变量(如alert,console),true -- 启用,false -- 关闭. 20 | 21 | 示例:未启用 22 | /* jshint devel:false */ 23 | alert('log...'); // JSHint校验结果:'alert' is not defined. 24 | 25 | #### * dojo 26 | 27 | 作用:该选项定义了dojo暴露出来的全局变量,true -- 启用,false -- 关闭. 28 | 29 | #### * jquery 30 | 31 | 作用:该选项定义了jquery暴露出来的全局变量,true -- 启用,false -- 关闭. 32 | 33 | 示例1:未启用 34 | /* jshint jquery:false */ 35 | var a = jQuery('#a'); // JSHint校验结果:'jQuery' is not defined. 36 | 37 | 示例2:启用 38 | /* jshint jquery:true */ 39 | var a = jQuery('#a'); // JSHint校验结果:ok 40 | 41 | #### * mootools 42 | 43 | 作用: 该选项定义了mootools暴露出来的全局变量,true -- 启用,false -- 关闭. 44 | 45 | #### * node 46 | 47 | 作用:该选项定义了Node环境中的全局变量. 48 | 49 | #### * nonstandard 50 | 51 | 作用:该选项定义了一些非标准但广泛使用的全局变量,像"escape"和"unescape". 52 | 53 | #### * prototypejs 54 | 55 | 作用:该选项定义了Prototype中暴露出来的全局变量. 56 | 57 | #### * rhino 58 | 59 | 作用:该选项定义了Rhino环境中的全局变量. 60 | 61 | #### * worker 62 | 63 | 作用:??? 64 | 65 | #### * wsh 66 | 67 | 作用:??? 68 | 69 | #### * yui 70 | 71 | 作用:该选项定义了YUI中暴露出来的全局变量. 72 | -------------------------------------------------------------------------------- /legacy_options.md: -------------------------------------------------------------------------------- 1 | # JSHint legacy options 2 | 3 | 说明:这些选项继承至JSLint. 4 | 5 | #### * nomen 6 | 7 | 作用:是否允许变量名以"_"开头或结尾,false -- 允许,true -- 不允许. 8 | 9 | 示例:值为true时 10 | 11 | /* jshint nomen:true */ 12 | var _a = 1; 13 | alert(_a); // JSHint校验结果:Unexpected dangling '_' in '_a'. 14 | 15 | /* jshint nomen:true */ 16 | var a_ = 1; 17 | alert(a_); // JSHint校验结果:Unexpected dangling '_' in 'a_'. 18 | 19 | /* jshint nomen:true */ 20 | var a_b = 1; 21 | alert(a_b); // JSHint校验结果:ok 22 | 23 | #### * onevar 24 | 25 | 作用:允许每个函数中只有一个var语句(如var a,b,c;). 26 | 27 | #### * passfail 28 | 29 | 作用:让JSHint停在第一个错误/警告处,true -- 启用,false -- 不启用. 30 | 31 | 示例:启用 32 | 33 | /* jshint passfail:true */ 34 | function show() { 35 | var b = 1; 36 | alert(a); // JSHint校验结果:Stopping. (87% scanned). 37 | } 38 | 39 | #### * white 40 | 41 | 作用:让JSHint检查你的代码是否违反道格拉斯的JS编码风格. 42 | -------------------------------------------------------------------------------- /relaxing_options.md: -------------------------------------------------------------------------------- 1 | JSHint relaxing options 2 | ================= 3 | 4 | #### * asi 5 | 6 | 作用:值为false时,如果代码末尾省略了分号,则JSHint会给出警告;值为true时,则不会. 7 | 8 | #### * boss 9 | 10 | 作用:值为false时,如果预期为条件表达式的地方使用了赋值表达式,则JSHint会给出警告;值为true时,则不会. 11 | 12 | 示例:/* jshint boss:false */ 13 | 14 | // 例1: if条件判断中存在赋值操作 15 | var a; 16 | if (a = 1) { // jshint校验结果:Expected a conditional expression and instead saw an assignment. 17 | alert(1); 18 | } 19 | 20 | // 例2: for循环的条件判断中存在赋值操作 21 | for (var i = 0, j; j = i; i++) { // jshint校验结果:同上 22 | alert(j); 23 | } 24 | 25 | #### * debug 26 | 27 | 作用:值为false时,如果代码中有debugger语句,则JSHint会给出警告;值为true时,则不会. 28 | 29 | 示例:/* jshint debug:false */ 30 | 31 | function show() { 32 | alert(1); 33 | debugger; // jshint校验结果:Forgotten 'debugger' statement? 34 | } 35 | 36 | #### * eqnull 37 | 38 | 作用:值为false时,如果代码中使用"=="来比较变量与null,则JSHint会给出警告;值为true时,则不会. 39 | 40 | 示例:/* jshint eqnull:false */ 41 | 42 | var a; 43 | alert(a == null); // Expected '===' and instead saw '=='. 44 | 45 | #### * esnext 46 | 47 | 作用:值为true时,JSHint会使用ECMAScript 6的语法来校验你的代码. 48 | 49 | #### * evil 50 | 51 | 作用:值为false时,不允许在代码中使用eval. 52 | 53 | #### * expr 54 | 55 | 作用:值为false时,只允许在函数调用或赋值时使用表达式. 56 | 57 | 示例:/* jshint expr:false */ 58 | 59 | // JSHint校验结果:Expected an assignment or function call and instead saw an expression. 60 | 2 > 1 ? (alert(1)) : (alert(2)); 61 | 62 | #### * funcscope 63 | 64 | 作用:值为false时,如果在控制语句中定义了变量,却在控制语句之外使用变量,则JSHint会给出警告. 65 | 66 | 备注:JS中只有两种作用域:全局作用域与函数作用域. 67 | 68 | 示例:/* jshint funcscope:false */ 69 | 70 | function test() { 71 | if (true) { 72 | var x = 0; 73 | } 74 | 75 | x = x + 1; // JSHint校验结果:'x' used out of scope. 76 | } 77 | 78 | #### * globalstrict 79 | 80 | 作用:值为false时,不允许使用全局级别的严格模式. 81 | 82 | 备注:在全局中使用严格模式,会影响到第三方的JS,因此不建议这么做. 83 | 84 | 示例:/* jshint globalstrict:false */ 85 | 86 | "use strict"; // JSHint校验结果:Use the function form of "use strict". 87 | function show() { 88 | alert(1); 89 | } 90 | 91 | #### * iterator 92 | 93 | 作用:??? 94 | 95 | #### * lastsemic 96 | 97 | 作用:值为true时,允许单行语句块中最后一条语句不写分号;值为false时,则会给出警告. 98 | 99 | 示例:值为true和false时,校验结果对比(return语句未写分号) 100 | 101 | /* jshint lastsemic:true */ 102 | var a = function() {alert(1);return 'hehe'}(); // JSHint校验结果:pass 103 | 104 | /* jshint lastsemic:false */ 105 | var a = function() {alert(1);return 'hehe'}(); // JSHint校验结果:Missing semicolon. 106 | 107 | #### * laxbreak 108 | 109 | 作用:值为true时,允许代码中存在大多数不安全的换行(不包括逗号出现在行首的情况);值为false时,会给出警告. 110 | 111 | 示例:暂无(哪些换行是不安全滴???). 112 | 113 | #### * laxcomma 114 | 115 | 作用:值为true时,允许逗号出现在行首的换行方式;值为false时,会给出警告. 116 | 117 | 示例:值为true和false时,校验结果对比 118 | 119 | /* jshint laxcomma:true */ 120 | var obj = { 121 | name: 'haha' 122 | ,age: 24 // JSHint校验结果:pass 123 | }; 124 | 125 | /* jshint laxcomma:false */ 126 | var obj = { 127 | name: 'haha' 128 | ,age: 24 // JSHint校验结果:Bad line breaking before ','. 129 | }; 130 | 131 | #### * loopfunc 132 | 133 | 作用:值为true时,允许在循环中定义函数;值为false时,会给出警告. 134 | 135 | 示例:值为false 136 | 137 | /* jshint loopfunc:false */ 138 | var nums = []; 139 | for (var i = 0; i < 10; i++) { 140 | nums[i] = function (j) { // JSHint校验结果:Don't make functions within a loop. 141 | return i + j; 142 | }; 143 | } 144 | nums[0](2); 145 | 146 | #### * moz 147 | 148 | 作用:该选项告诉JSHint,你的代码中使用了Mozilla JavaScript扩展. 149 | 150 | #### * multistr 151 | 152 | 作用:值为true时,允许多行字符串;值为false时,则会给出警告. 153 | 154 | 备注:当值为true时,如果多行之间缺少转义字符,或者转义字符与新行之间有空白,JSHint依然会给出警告. 155 | 156 | 示例1:值为true 157 | 158 | /* jshint multistr:true */ 159 | var text = "hello\ 160 | world"; // JSHint校验结果:pass 161 | 162 | 示例2:值为true,但缺少转义字符 163 | 164 | /* jshint multistr:true */ 165 | var text = "hello 166 | world"; // JSHint校验结果:Unclosed string. 167 | 168 | 示例3:值为true,有转义字符,但转义字符与新行之间有空白 169 | 170 | /* jshint multistr:true */ 171 | var text = "hello\ 172 | world"; // JSHint校验结果:Bad or unnecessary escaping. 173 | 174 | 示例4:值为false,有转义字符 175 | 176 | /* jshint multistr:false */ 177 | var text = "hello\ 178 | world"; // JSHint校验结果:Bad escaping of EOL. Use option multistr if needed. 179 | 180 | #### * proto 181 | 182 | 作用:值为true时,允许在代码中使用__proto__属性;值为false时,则会给出警告. 183 | 184 | #### * scripturl 185 | 186 | 作用:值为true时,允许在代码中使用"javascript:..."这样的url;值为false时,则会给出警告. 187 | 188 | 示例:值为false时 189 | 190 | /* jshint scripturl:false */ 191 | var link = document.createElement('a'); 192 | link.href = 'javascript:void()'; // JSHint校验结果:Script URL. 193 | 194 | #### * smarttabs 195 | 196 | 作用:??? 197 | 198 | #### * shadow 199 | 200 | 作用: 201 | 202 | #### * sub 203 | 204 | 作用:值为true时,允许用obj['name']和obj.name两种方式访问对象的属性;值为false时,不允许使用obj['name']方式, 205 | 除非只能使用这种方式访问. 206 | 207 | 示例:值为false 208 | 209 | /* jshint sub:false */ 210 | var obj = {name: 'he'}; 211 | alert(obj['name']); // JSHint校验结果:['name'] is better written in dot notation. 212 | 213 | #### * supernew 214 | 215 | 作用:是否允许使用像"new function() {...}"这样怪异的构造器,true -- 允许,false -- 不允许. 216 | 217 | 示例:值为false 218 | 219 | /* jshint supernew:false */ 220 | var obj = new function() { // JSHint校验结果:Weird construction. Is 'new' unnecessary? 221 | return {name: 'ha'}; 222 | }; 223 | 224 | #### * validthis 225 | 226 | 作用:是否允许在严格模式下的非构造函数中使用this,true -- 允许,false -- 不允许. 227 | 228 | 备注:该选项只能用于函数作用域中. 229 | 230 | 示例:值为false 231 | 232 | function show() { 233 | /* jshint validthis:false */ 234 | 'use strict'; 235 | this.name = 'haha'; 236 | alert(this.name); // JSHint校验结果:Possible strict violation. 237 | } 238 | --------------------------------------------------------------------------------