用JSLint精炼提升JavaScript代码

标签: IT技术 Javascript JSLint 代码质量工具 编码规范 | 发表时间:2012-10-30 17:59 | 作者:
出处:http://blog.jobbole.com

英文原文: Using JSLint to Refine Your Code,编译: 伯乐在线 – 胡蓉@蓉_inShanghai

由于移动应用的盛行和HTML5的广泛运用,JavaScript正越来越流行。JavaScript受欢迎的部分原因是因为它的灵活便捷,你可以快速上手,它不需要重量级的开发环境,也不需要第三方应用支持,只要你打开一个文本编辑器,然后保存,最后通过网页 浏览器运行即可。

但是,对于新手而言,使用JavaScript处处存在陷阱。在一段复杂的脚本中,JavaScript语言的延展性常常引起怪异的bug。例如,未声明的局部变量可能会不知不觉修改全局变量。

现在,打开 JSLint网站,正如其网站所言,它是“JavaScript代码质量工具”。JSLint的作者是Douglas Crockford,因其对JavaScript(ECMAScript)和JSON的贡献而著名。

(译注:Douglas Crockford是 web领域技术权威之一,他是JSON、JSLint、JSMin和ADSafe的创造者,也是名著《JavaScript: The Good Parts》(中文版《 JavaScript语言精粹》)的作者。撰写了许多广为流传、影响深远的技术文章,包括“JavaScript:世界上最被误解的语言”。)

JSLint帮助JavaScript 程序员在编程过程中遵循一定的编码规范。JSLint是以基于严格模式(Strict Mode)为前提,参考第5版ECMAScript标准。与一般模式相比,严格模式下你的代码需要按照更严格的规则运行。

(译注:对严格模式不了解的童鞋,可以参考这两篇文章《 ECMAScript 5.1简介》《 是时候使用JavaScript严谨模式(Strict Mode)提升团队开发效率》)

 

使用JSLint

我们来用JSLint运行一个示例。写一个简单的jQuery插件,通过prefix显示msg接收的信息,如果传给type的值为false则不显示prefix。

(function ($) {
    $.fn.loading = function(msg, type, cssClass){
        var prefixes = {
            warning: 'Warning: ' + msg,
            error: 'Error: ' + msg,
            info: 'Info: ' + msg,
            warning: 'Caution: ' + msg,
        };
        if (type) {
            concatMsg = prefixes[type];
        } else {
            concatMsg = msg;
        }
        $(this).each(function()  {
            var tis = $(this)
            if (msg == false) {
                tis.html('');
            } else {
                tis.html(concatMsg);
            }
        });
     }
})(jQuery);

尽管这段代码作为jQuery的插件运行还算正常,但当你用Firefox或Chrome运行时,会发现有几处明显的错误,以及一些不易察觉的问题。与其耗费脑力解决这些问题,不如通过JSLint来帮助我们。将上面这段代码拷贝至JSLint网站的文本框内,然后点击”JSLint”按钮,代码建议和错误提示会出现在下方。

JSLint指出的第一个错误是:丢失“use strict”声明。这个错误表示该函数未在严格模式下执行。为纠正该错误,我们在函数主体的头部,添加“use strict”语句以启动严格模式。

'use strict';

加入严格模式声明语句后,再次点击“JSLint”按钮,提示丢失“use strict”的错误信息将消失。现在,我们可以继续看下一个错误。接下来的这个错误是关于空格的问题,鉴于它不能算个真正的错误,我们可以放心地忽略它。

你可以将页面最下方的“messy white space”选项改为true,这样你就可以保留function关键字后不留空格的写法。但是现在,我们保留“messy white space”选项的default属性,因为这个功能也会帮助我们检查其他空格问题,这个我们之后再说。

同样需要注意的是,虽然JSLint指出的第二个和第三个错误指向同一行代码,但错误点并不一样。后者JSLint建议在右括号“)”和左大括号“{”之间空一格,现在我们纠正下这个错误。

插入空格后,再次点击“JSLint”按钮,下一个错误出现在第8行,第39个字符处。prefixes对象包含了两个一模一样的warning属性,将第二个warning修改为caution。

这次就不再点击“JSLint”按钮,直接看下一个错误吧。定义对象的代码块的最后多了一个逗号。像这类错误,Chrome和Firefox这些浏览器也许会忽略,但IE就不会那么友好了,所以我们把这个逗号移除掉。

之后的两个错误指向未定义的变量concatMsg。如果一个变量在当前作用域中没有被定义,JavaScript就会全局查找看是否有在别处定义过。若这时你还引入了外部代码,并碰巧在全局中定义过该变量,那么一旦出错,你很有可能要抓破头皮,费尽心力地寻找bug原因。所幸有了JSLint,我们可以将这类错误扼杀在摇篮中。

现在纠正这个错误,并 重构代码。因为concatMsg的默认值为msg,所以我们可以将msg先赋给它,待需要时再修改。如下所示,关于concatMsg的代码为:

var concatMsg = msg;
if (type) {
    concatMsg = prefixes[type];
}

继续往下,有一个与之前类似的空格问题,纠正它。紧接着,JSLint指出丢失了一个分号(如下图所示)。JSLint会假设没有分号结尾的命令行永远不会被终止。所以,当下面出现if时,JSLint认为这里应该有个分号。尽管根据语言规范,结束的分号可有可无,但是加上它是一个良好的习惯。因为这类不良代码在大项目协作中很容易引起莫名的bug。所以平常编码过程中,应顺手避免此类问题。

接下来又是一个很好的错误例子。JavaScript中,有‘相等’(==)和严格的‘相等’(===)比较。在这段案例代码中,如果不采用严格‘相等’比较,那么不管msg为空字符串还是false值,if内都为true。所以,这里我们采用严格‘相等’比较。

好了,让我们再次点击“JSLint”按钮吧。如下图所示,错误出现在第10行,JSLint认为合并变量声明也是一个良好的编码规范。尽管concatMsg变量的声明紧随prefixes之后,但JSLint认为用逗号隔开,在一个命令语句中完成变量声明更好。

下一个错误则又是关于格式的问题。咋一看,不就是多空了一格嘛,实在是太鸡毛蒜皮了。但是,如果在大量的脚本中,这种缩进问题搞不好也会引起难以发现的bug。所以,为了代码的统一性,我们还是往前移一格吧。

下一个问题又和之前遇到的类似,但形式不一样。JavaScript的函数也可归属为变量,所以和其他变量赋值语句一样,JSLint希望在末尾加个分号。

最后,如下所示,有两个错误出现在最后一行。第一个问题,JSLint建议将闭括号移至jQuery之后,因为这样不会使闭包函数定义产生歧义。第二个问题,JSLint认为jQuery变量不存在。但事实上你可能在实际页面中已引入了jQuery文件,所以我们可以在页面最下面的文本框内输入“jQuery”来解决这个问题(译者:JSLint Directive上面的文本框)。

再次运行JSLint,它提示该函数需要接收三个参数。但是在本示例中,我们从未使用过第三个参数。因此,此处我们有两种方法解决这个问题。第一种,删除第三个参数。第二种,将下方的“unused parameters”项改为true。如果你确实是因为某些原因需要保留这个参数,则用第二种方法。

好了,用JSLint改进后的代码如下所示:

(function ($) {
    'use strict';
    $.fn.loading = function (msg, type, cssClass) {
        var prefixes = {
            warning: 'Warning: ' + msg,
            error: 'Error: ' + msg,
            info: 'Info: ' + msg,
            caution: 'Caution: ' + msg
        }, concatMsg = msg;
        if (type) {
            concatMsg = prefixes[type];
        }
        $(this).each(function () {
            var tis = $(this);
            if (msg === false) {
                tis.html('');
            } else {
                tis.html(concatMsg);
            }
        });
    };
}(jQuery));

 

JSLint 指令

你可以通过JSLint指令在你的源代码中直接定义JSLint变量。这样,你就不用在页面上来回操作。如下示例,注释中定义了jQuery全局变量,并将“unparam”设为true。

/*global jQuery*/
/*jslint unparam: true */
(function ($) {
    ‘use strict’;
…
}(jQuery));

 

总结  

在这个简短的例子中,JSLint指出了一些明显的和一些容易忽视的错误。在实际运行代码之前,通过JSLint帮我们查找一些错误可以有效的提高我们的开发效率和代码质量。如果你真的是认真地想写出优质的代码,那么在放到服务器上运行之前先用JSLint检查一遍吧。JSLint还提供一个独立的JS文件版本,所以你也可以把它下载下来在线下运行!

———————————————–我是分割线———————————————

译者:

严格模式并不是所有的浏览器都支持,这是一个 浏览器支持统计表。网页前端可能暂时(甚至很长时间内)还不能遵循严格模式,但是在移动开发中显然采用严格模式更佳。不管目前是否能用上,我觉得前端工程师们都应该利用这些工具帮助自己养成良好的编码习惯,好的习惯会让你受益匪浅,在这里略矫情略夸张的引用一下电影《铁娘子》中的一句话:Watch your habits, for they become your character

 

 

英文原文: Using JSLint to Refine Your Code,编译: 伯乐在线 -  胡蓉

【如需转载,请标注并保留原文链接、译文链接和译者等信息,谢谢合作!】

 

相关文章

相关 [jslint 精炼 提升] 推荐:

用JSLint精炼提升JavaScript代码

- - 博客 - 伯乐在线
英文原文: Using JSLint to Refine Your Code,编译: 伯乐在线 – 胡蓉( @蓉_inShanghai). 由于移动应用的盛行和HTML5的广泛运用,JavaScript正越来越流行. JavaScript受欢迎的部分原因是因为它的灵活便捷,你可以快速上手,它不需要重量级的开发环境,也不需要第三方应用支持,只要你打开一个文本编辑器,然后保存,最后通过网页 浏览器运行即可.

使用 JSLint 保证 JavaScript 代码质量

- zhibin - IBM developerWorks 中国 : Web development : Articles,Tutorials
随着富 Web 前端应用的出现,开发人员不得不重新审视并重视 JavaScript 语言的能力和使用,抛弃过去那种只靠“复制 / 粘贴”常用脚本完成简单前端任务的模式. JavaScript 语言本身是一种弱类型脚本语言,具有相对于 C++ 或 Java 语言更为松散的限制,一切以函数为中心的函数式编程思想也为开发人员提供了更加灵活的语法实现.

在Eclipse中使用JSLint保证JavaScript代码质量

- - 博客园_梦想天空
JavaScript 作为一门语法灵活多变且对格式要求相对松散的语言,代码格式的混乱和某些语言特性的不正确使用,往往使得最终交付的产品中包含许多因编码风格约定造成的未预见的行为或错误,这种习惯性的问题如果不及时指出并修改,往往会在项目的迭代过程中不断的重现,严重影响 Web 产品的稳定性与安全性. JSLint 正是 Douglas Crockford 为解决此类问题创建的工具,JSLint 除了能指出这些不合理的约定,还能标出结构方面的问题.

Go 1.1 的性能提升

- - 博客 - 伯乐在线
伯乐在线注:今天上午在微博推荐了英文原文,感谢 @Codefor 的热心翻译. 如果其他朋友也有不错的原创或译文,可以尝试 推荐给我们. 这是Go1.1发布后性能提升分析系列的第一篇文章. Go官方文档( 这里和 这里)报告说,用Go1.1重新编译你的代码就可以获得30%-40%的性能提升.

提升Java的锁性能

- - Java译站
几个月前我们介绍了如何通过 Plumbr来 进行线程锁检测,随后便收到了很多类似的问题,“Hi,文章写得不错,现在我终于知道是什么引发的性能问题了,但是现在我该怎么做. 为了在我们的产品中集成这个解决方案,我们付出了许多努力,不过在本文中,我想给大家分享几个常用的优化技巧,而不一定非要使用我们这款锁检测的工具.

六种习惯提升大脑能力

- sayhelen - 战隼的学习探索
科学家发现,成年人大脑的可塑性远比预计的强. 我们的日常行为和周边环境,都能引起大脑神经回路的重新连接、功能重组和位置的改变. 有些人甚至认为,不同的思考方式也足以重塑大脑.     研究表明,小鼠在滚轴上训练一段时间之后,海马区神经元数量显著增加,在学习和记忆测试中表现得更好. 针对人类的研究也显示,体育锻炼能提高大脑的执行能力(包括计划、组织、多任务处理能力等).

提升 web 应用程序的性能

- pathfinder - IBM developerWorks 中国 : 文档库
作为 web 用户,我们知道页面加载或刷新的速度对其成功至关重要. 本文将帮助您更好地理解影响 web 应用程序性能的因素. 学习识别这些问题并且找到客户端内容的瓶颈. 探索 JavaScript、DOM、CSS 和 Dojo 小部件的性能问题. 将通过一个例子展示使用 YSlow 和 Firebug 适当调整 Dojo 小部件.

30个自我提升技巧

- beta4better - 译言-生活点滴
来源30 Self Improvement Ideas.     你可以利用这些自我提升技巧作为提升自身作为的纲领. 如果你想成为生活中积极向上,这是十分重要的一点.   如果你懒惰又没有强有力的一直,你很可能就要过着平庸的生活了. This will make you unwilling to change your circumstances, although you would know that it would benefit you in many ways..

TCmalloc对squid的性能的提升

- caoxg - 开心平淡对待每一天。热爱生活
           TCmalloc对squid的性能的提升一、简介:. 1、安装tcmalloc所需要的libunwind库 [32位系统不用安装]. *注意:据说加上’–with-large-files’ 选项时编译会出错. 4、配置好squid并启动squid.. squid+tcmalloc: 20 型号:Dell R410 硬盘:2*SAS/146G/15K 内存:16G CPU:16.

e4rat:大幅提升Linux开机速度

- Druggo - LinuxGem
警告:此软件仅限原生ext4文件系统使用. 其他文件系统以及从低版本升级的ext4文件系统用户不要使用,否则将导致灾难性后果.   本着负责的态度,先Warning. 其原理大致是(我猜的):通过磁盘整理有序化开机要加载的文件,并在系统启动阶段把数据预读到内存,充分使用内存和IO资源. snack 发表于 Mon, 20 Jun 2011 23:03:28 +0000.