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或者falsetrue说明这个变量可以在这个文件引用,false说明不允许(默认)这个指令涉及到函数范围内。

有些全局变量为你预定义好了,选择一个浏览器(browser)选项来预定义一个web浏览器提供的全局属性。例如documentaddEventListener。 它和下面这段代码作用一样:

/*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)选项来预定义一些在开发环境中有用的全局变量,但这些应该在生产环境中避免。例如consolealert
它和下面这段代码作用一样:

/*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 in

尽量避免for,实在不行这样用 for in:

for (name in object) { if (object.hasOwnProperty(name)) { .... } }

switch

使用break, return 或者throw, 不然就报错。

var

jslint的规则:

with

不希望看到这个东西

=

不希望看到if (a = b) { ... }

== 和 !=

==和!= 之前会做类型转换,例如 '\t\r\n' == 0true的,这可能导致一些错误。不能保证你会使用 == 和!= 所以不要使用== 和!= 使用=== 和!==来代替。

Labels

少用或者不用

不能到达的代码

jslint期望 return, break, continue, 或者throw之后都有}或者case或者default跟着。

容易迷惑的+ -

++ –

plusplus option来禁用或者启用。

位操作符

javascript没有整型,但有位操作符,所以最好不用

bitwise option开关

eval是魔鬼

不要用

void

不要用

正则表达式

把正则表达式字面量跟在 ( 或者 = 或者 : 或者,。

构造函数和new

属性

不安全的字符

没有检查项

选项

报告

反馈

试试

实现