使用JSLint提高JS代码质量方法分享


Posted in Javascript onDecember 16, 2013

随着富 Web 前端应用的出现,开发人员不得不重新审视并重视 JavaScript 语言的能力和使用,抛弃过去那种只靠“复制 / 粘贴”常用脚本完成简单前端任务的模式。JavaScript 语言本身是一种弱类型脚本语言,具有相对于 C++ 或 Java 语言更为松散的限制,一切以函数为中心的函数式编程思想也为开发人员提供了更加灵活的语法实现。然而,这种灵活性在带来高效的同时,也成为初学或者经验不足的 JavaScript 开发人员的噩梦。形式各异的代码风格、隐含错误的代码行为,严重影响了整体代码的可读性和稳定性,成为 Web 项目中最为常见问题之一。

因而,我们需要一个有效的 JavaScript 代码质量工具,以便能及时发现并修正 JavaScript 代码中所隐含的问题,保证代码交付质量。JSLint 作为一个灵活有效的 JavaScript 代码质量检测工具,允许使用者指定满足其特定应用开发需求的编码风格约定,使得整个项目的风格统一,这种“规则”(options)驱动的工作方式使得 JSLint 能够适用于不同的代码检测需求。本文将首先向读者介绍 JSLint 的基本概念和作用,讲解其基于规则的工作方式,而后通过一个示例阐明其基本的使用方法,最后介绍如何将 JSLint 整合到 Ant 和 Eclipse 的应用过程,以全方面展示如何将 JSLint 在日常开发任务中加以运用。

什么是 JSLint
JavaScript 作为一门年轻、语法灵活多变且对格式要求相对松散的语言,代码格式的混乱和某些语言特性的不正确使用,往往使得最终交付的产品中包含许多因编码风格约定造成的未预见的行为或错误,这种习惯性的问题如果不及时指出并修改,往往会在项目的迭代过程中不断的重现,严重影响 Web 产品的稳定性与安全性。JSLint 正是 Douglas Crockford 同学为解决此类问题创建的工具,JSLint 除了能指出这些不合理的约定,还能标出结构方面的问题。虽然 JSLint 不能保证代码逻辑一定正确,但却有助于发现错误并教会开发人员一些好的编码实践。值得一提的是 JSLint 工具本身也是一段 JavaScript 代码,它是检验 JavaScript 代码质量的 JavaScript 脚本。JSLint 对 JavaScript 脚本的质量检测主要包括以下几个方面:

•检测语法错误:例如大括号“{}”的配对错误。
•变量定义规范:例如未定义变量的检测。
•代码格式规范:例如句末分号的缺失。
•蹩脚语言特性的使用检测:如 eval 和 with 的使用限制。
JSLint 的版本更新一直处于活跃状态,截至本文撰写之时,JSLint 最新版本的发布时间为 2010-10-10。很多主流代码编辑器均对 JSLint 提供了良好的扩展支持,包括 Eclipse、VS2008 等等。

目前,与 JSLint 功能类似的 JavaScript 代码检测工具有很多,包括:YUI Test、Firebug、MS Script Debugger 、CompanionJS 等等,它们中大多数都是以浏览器插件的形式存在于客户端浏览器进行 JavaScript 运行时的检测和调试,JSLint 与这些工具的重要区别在于其更加注重静态代码格式的检测,而这也正是当前火热的敏捷开发中持续构建所需要和提倡的。

认识 JSLint 规则
JSLint 执行代码质量检测的原理核心在于用户设定的规则集。JSLint 默认提供的规则集包含了 Web 开发人员多年积累下来的认为不好的开发风格,我们可以根据自己项目的需求选择构建一套特定的规则。JSLint 将根据它进行对 JavaScript 脚本的扫描工作,并给出相应的问题描述信息。规则的形式体现为多组键值对:[param:option],以规则名做键,对规则调用与否做值。例如规则:“plusplus:true”是不允许 ++ 和 -- 运算符的出现,“undef:true”是不允许使用未定义的变量。

由于 JSLint 工具本质上是一个普通的 JS 脚本,其运行也自然依赖于一个 JS 运行引擎,其被引擎加载后会在内存中产生一个全局 JSLint 函数对象,该函数对象需要两个输入量:source 和 options,前者用来指定待检测的脚本文件被解析后生成的字符串或字符串数组,后者则表示用户自定义的规则选项。若 options 为空,JSLint 则使用其默认的规则对 source 进行扫描检测。

整个检测过程就是对脚本中所含 JSLINT (source, options) 函数的一次执行过程。当指定的 source 脚本在 options 条件下检测通过,则 JSLint 返回 true,否则返回 false,而这时则可以通过 JSLINT.errors 对象获得详细的错误信息。图 1 展示了 JSLint 的整个工作过程。

图 1. JSLint 工作过程示意图

使用JSLint提高JS代码质量方法分享

如图所示,规则集的配置方式有三种:

1.直接通过修改 JSLint.js 源码来修改默认规则。
2.在 JSLint 函数运行时,同时设置 options 参数,动态改变其规则选项(first overwrite)。此方式适用于对批量 js 文件使用同样的一组自定义规则。
3.通过在待检测的 js 文件头部添加注释类型的规则,对单个 js 文件添加适用于该文件代码的特殊规则(second overwrite)。此方式适用于对不同 js 文件设置特定的检测规则,通常用于在该文件中引入一些全局变量。

Javascript 相关文章推荐
js和jquery中循环的退出和继续下一个循环
Sep 03 Javascript
js简单判断移动端系统的方法
Feb 25 Javascript
js滑动提示效果代码分享
Mar 10 Javascript
AngularJs  Using $location详解及示例代码
Sep 02 Javascript
jQuery.ajax实现根据不同的Content-Type做出不同的响应
Nov 03 Javascript
AngularJS 在同一个界面启动多个ng-app应用模块详解
Dec 20 Javascript
JavaScript正则表达式的贪婪匹配和非贪婪匹配
Sep 05 Javascript
浅析node应用的timing-attack安全漏洞
Feb 28 Javascript
详解在React项目中安装并使用Less(用法总结)
Mar 18 Javascript
分享Angular http interceptors 拦截器使用(推荐)
Nov 10 Javascript
js实现简单的随机点名器
Sep 17 Javascript
Angular处理未可知异常错误的方法详解
Jan 17 Javascript
javascript操作table(insertRow,deleteRow,insertCell,deleteCell方法详解)
Dec 16 #Javascript
利用js动态添加删除table行的示例代码
Dec 16 #Javascript
js判断undefined类型,undefined,null, 的区别详细解析
Dec 16 #Javascript
innerHTML,outerHTML,innerText,outerText的用法及区别解析
Dec 16 #Javascript
js AppendChild与insertBefore用法详细对比
Dec 16 #Javascript
js中AppendChild与insertBefore的用法详细解析
Dec 16 #Javascript
JS获取月的最后一天与JS得到一个月份最大天数的实例代码
Dec 16 #Javascript
You might like
php调用dll的实例操作动画与代码分享
2012/08/14 PHP
解决cPanel无法安装php5.2.17
2014/06/22 PHP
PHP与jquery实时显示网站在线人数实例详解
2016/12/02 PHP
Django中的cookie与session操作实例代码
2017/08/17 PHP
Yii框架通过请求组件处理get,post请求的方法分析
2019/09/03 PHP
javascript中的几个运算符
2007/06/29 Javascript
浅谈Javascript的静态属性和原型属性
2015/05/07 Javascript
JavaScript中的Math.SQRT1_2属性使用简介
2015/06/14 Javascript
用Move.js配合创建CSS3动画的入门指引
2015/07/22 Javascript
JS、jQuery中select的用法详解
2016/04/21 Javascript
微信小程序 获取相册照片实例详解
2016/11/16 Javascript
BootStrap实现响应式布局导航栏折叠隐藏效果(在小屏幕、手机屏幕浏览时自动折叠隐藏)
2016/11/30 Javascript
Jquery Easyui自定义下拉框组件使用详解(21)
2020/12/31 Javascript
Angular-Ui-Router+ocLazyLoad动态加载脚本示例
2017/03/02 Javascript
JavaScript之iterable_动力节点Java学院整理
2017/06/29 Javascript
Bootstrap Tooltip显示换行和左对齐的解决方案
2017/10/11 Javascript
ES6 Class中实现私有属性的一些方法总结
2019/07/08 Javascript
vue中使用element ui的弹窗与echarts之间的问题详解
2019/10/25 Javascript
JavaScript 中的无穷数(Infinity)详解
2020/02/13 Javascript
如何实现小程序与小程序之间的跳转
2020/11/04 Javascript
[03:03]2014DOTA2西雅图国际邀请赛 Alliance战队巡礼
2014/07/07 DOTA
[45:10]NB vs Liquid Supermajor小组赛 A组胜者组决赛 BO3 第二场 6.2
2018/06/04 DOTA
python使用wmi模块获取windows下硬盘信息的方法
2015/05/15 Python
浅谈Scrapy框架普通反爬虫机制的应对策略
2017/12/28 Python
Django中URL的参数传递的实现
2019/08/04 Python
爬虫代理的cookie如何生成运行
2020/09/22 Python
python 实现的车牌识别项目
2021/01/25 Python
使用CSS3实现input多选框自定义样式的方法示例
2019/07/19 HTML / CSS
荷兰鞋子在线:Nelson Schoenen
2017/12/25 全球购物
巴西香水和化妆品购物网站:The Beauty Box
2019/09/03 全球购物
Java如何读取CLOB字段
2013/10/10 面试题
最新计算机专业自荐信
2013/10/16 职场文书
环境科学专业个人求职信
2013/12/15 职场文书
我的大学四年规划书范文2014
2014/09/26 职场文书
加强机关作风建设心得体会
2014/10/22 职场文书
2014年劳动部工作总结
2014/12/11 职场文书