JSlint 是一个javascript程序,为了检查javascript程序中的错误,它是一个代码质量工具。
当c还是一个年轻的编程语言的时候,有几个很普通的程序错误不会被早期的编译器发现,一个叫做lint的
程序被开发出来来扫描源文件,来查找这些问题。
随着语言的不断成熟,语言的定义不断加强来消除这些不安全的特性,而且编译器在错误警告上也变的越来越好
这样lint就不在需要了。
javascript在年龄上是一个年轻的语言,它起源于在网页中完成一些小任务。那些对java来说太笨重的任务。但是javascript是很强大的一门语言,它现在被用在大型的项目里。当项目变得复杂的时候,很多特性是为了针对让语言更好的被使用这就有点让人很烦。一个针对javascript的lint工具显得很有必要了,用来做语法检查和验证器。
jslint扫描javascript源代码,如果它发现问题,它就返回一个描述这个问题的信息,和一个源代码的位置信息。问题可能不只是一个语法错误, 但通常是。jslint还检查一些常用风格作为一种结构问题。它不能证明你的程序是正确的。它只是从另一个角度帮助你定位问题所在。
jslint定义了一个javascript专业的子集, 一个更严格的语言,被定义在标准的ECMAScript语言第三版, 有关的推荐可以在这里找到: javascript 编程语言的常用代码风格
javascript是一个草率的语言,但它里面有高雅的,更好的一部分,jslint帮助你在这个更好的一部分来编程。jslint将会抵制不良的程序而浏览器不会,因为浏览器不关心你的代码质量,而jslint关心。你应该接受所有的jslint的建议。
jslint可以作用javascript源码或者json字串。
javascript的最大的问题是它依赖于全局变量。特别是隐含的全局变量,如果一个变量没有明确的定义(使用var关键字声明)这时候javascript就把他当成是全局的。这将会掩盖拼写错误的名字和其他问题。
jslint期望所有的变量和函数再使用或者调用之前都已经定义,这样它就能发现隐含的全局变量,它还是一个很好的实践习惯因为它使程序的可读性更好。
有时候一个文件依赖定义在别处的全局的变量和函数,你可以用var来声明明确告诉jslint这点,列出所有外在的依赖。
可以像这样
var getElementByAttribute, breakCycles, hamoi;
这个定义应该出现在文件顶端,一定要出现在这个变量被用的前面。
在变量引用之前定义是很有必要的。
jslint还可以认/*global*/
指令,它可以告诉jslint哪些变量是在这个文件中使用但是定义在别的文件。这个指令里可以包含逗号隔开的一个名称列表。每个名字可以选择性的使用一个冒号加一个true
或者false
。true
说明这个变量可以在这个文件引用,false
说明不允许(默认)这个指令涉及到函数范围内。
有些全局变量为你预定义好了,选择一个浏览器(browser
)选项来预定义一个web浏览器提供的全局属性。例如document
和addEventListener
。 它和下面这段代码作用一样:
/*global clearInterval: false, clearTimeout: false, document: false, event: false, frames: false, history: false, Image: false, location: false, name: false, navigator: false, Option: false, parent: false, screen: false, setInterval: false, setTimeout: false, window: false, XMLHttpRequest: false */
选择预设的console,alert (devel
)选项来预定义一些在开发环境中有用的全局变量,但这些应该在生产环境中避免。例如console
和 alert
。
它和下面这段代码作用一样:
/*global alert: false, confirm: false, console: false, Debug: false, opera: false, prompt: false, WSH: false */
选择假设的Node.js环境(node
)选项来预定义一些在node.js环境的一些变量。
/*global Buffer: false, clearInterval: false, clearTimeout: false, console: false, exports: false, global: false, module: false, process: false, querystring: false, require: false, setInterval: false, setTimeout: false, __filename: false, __dirname: false */
couch
Couch DB
/*global emit: false, getRow: false, isArray: false, log: false, provides: false, registerType: false, require: false, send: false, start: false, sum: false, toJSON: false */
Rhino
/*global defineClass: false, deserialize: false, gc: false, help: false, load: false, loadClass: false, print: false, quit: false, readFile: false, readUrl: false, runCommand: false, seal: false, serialize: false, spawn: false, sync: false, toint32: false, version: false */
javascript使用类c的语法风格,它要求使用分号来分割语句,javascript试图引入引号插入机制,(分号可有可无),这很危险,因为它能隐藏错误。
像c一样javascript支持++ –操作,使用分号可以消除这里的误会。
在javascript中,换行可以是一个空白,或者是一个分号,这对其他人来说不清晰。
jslint期望所有的表达式后面都有;
除了for
, function
, if
, switch
try
和 while
, jslint 同样不希望看到多余的;
和空的表达式
逗号操作可以写出很灵活的表达式,但是它会制造一些错误。
jslint希望看到逗号用来做分割,不希望把它当成衣蛾操作(特别是表达式初始化和增量部分)它也不想在数组表达式中看到省略号,额外的逗号不应该被使用。数组最后或者对象字面量最后的元素不应该出现逗号。因为在某些浏览器会报错。
在许多语言中,一个程序块定义了一个范围,内部的变量在外部是不可见的。
在javascript,一个程序块不是一个范围,这里只有function
的范围,一个在function
中定义的变量可以在这个function
所有地方可见。javascript的块概念会使很多老练的程序员迷惑。因为在别的语言中不会是这样的行为。
jslint希望用function
来作为块的概念,其他都不是。
其他语言都推荐变量定义在尽可能里使用的地方近一些。但是在javascript中没有程序块的概念,所以变量都定义在function
的顶部比较明智一些。推荐在每个function
里面使用一个var
. 可以使用vars选项来拒绝。
在if
, while
, do
, for
中使用 {}
不解释了。
一个表达式应该是一个赋值,一个function
或者方法的调用,或者是delete。其他的都将认为是错误的。
尽量避免for,实在不行这样用 for in:
for (name in object) { if (object.hasOwnProperty(name)) { .... } }
使用break, return 或者throw, 不然就报错。
jslint的规则:
不希望看到这个东西
不希望看到if (a = b) { ... }
==和!= 之前会做类型转换,例如 '\t\r\n' == 0
是 true
的,这可能导致一些错误。不能保证你会使用 == 和!= 所以不要使用== 和!= 使用=== 和!==来代替。
少用或者不用
jslint期望 return, break, continue, 或者throw之后都有}或者case或者default跟着。
plusplus option来禁用或者启用。
javascript没有整型,但有位操作符,所以最好不用
bitwise option开关
不要用
不要用
把正则表达式字面量跟在 ( 或者 = 或者 : 或者,。