Web前端开发最佳实践(11):使用更严格的JavaScript编码方式,提高代码质量
前言
JavaScript语言由于其固有的灵活性,所以导致开发者可以写出很多诡异的代码,甚至一些较为正常的特性,如类型隐式转换、this的指代等等,也会让刚接触此语言的开发者头大不已。尤其是那些熟知其他诸如Java和C#等高级语言的开发者。使用更严格的编码方式,可以最大量避免
启用严格模式
随着JavaScript的发展,开发者及规范制定者也意识到了JavaScript语言本身的一些设计缺陷,所以在ECMAScript5中引入了严格模式。设立严格模式的目的主要是为了消除JavaScript语法上不合理的地方,从而提高代码安全性、编译效率,增加运行速度且更好地兼容JavaScript未来的新版本等。
具体来说,严格模式主要是针对如下不合理的地方作了改进,包括:
禁用with关键字、防止意外地全局变量、函数中的this不再默认指向全局、防止函数参数重名、防止对象属性重名、更安全地使用eval等。具体可以参考mozilla网站上的详细介绍。
在严格模式中针对一些编码的格式进行了限制。有些在普通模式下不会报错的代码,在严格模式中可能就会出现运行错误。这种显式抛出错误的方式比以怪异方式运行代码能更早地发现问题。
严格模式目前已经得到了除IE8之外的大部分主流浏览器的支持,所以推荐在代码中使用。
启用严格模式很简单,只要在代码中添加如下代码即可:
"use strict";
在不支持严格模式的浏览器中,如下代码会被当作普通的语句运行,不会产生副作用:
<script>
"use strict";
console.log("这是严格模式。");
</script>
<script>
console.log("这是正常模式。");
</script>
下面介绍在使用严格模式时需要遵循的几条最佳实践。
1. 不要在全局中启用严格模式
若全局设置严格模式,将意味着代码文件中所有的代码都必须遵守严格模式。除非所有的代码都是自己维护,否则这么做会带来风险,因为不能保证其他人维护的代码也是符合严格模式的。比如如下的代码中,在代码文件设置了全局严格模式,应该避免这样的设置方式。
"use strict";
function doSomething() {
// 这部分代码会运行于严格模式
}
function doSomethingElse() {
// 这部分代码也会运行于严格模式
}
即使是其他人维护的代码在不同的文件中也不建议这么做,因为很难保证发布时候代码不会合并,所以尽量把严格模式限定在函数作用域范围内。类似如下的设置方式:
function doSomething() {
"use strict";
// 这个函数中的代码将会运行于严格模式
}
function doSomethingElse() {
// 这个函数中代码不会运行于严格模式
}
如果想给大量的代码设置严格模式,可以把代码包含在一个立即执行的函数内,并在函数开头启用严格模式,示例代码如下:
(function (){
"use strict";
// 其他代码
})();
2. 在已有代码中谨慎启用严格模式
如果代码中还包含有不符合严格模式的代码,则启用严格模式会产生风险,因为有可能会导致代码运行错误,页面无法正常展示和交互。在已有代码中启用严格模式要和代码的重构一样受到重视——必须有足够的代码检查和测试,确保每一行代码都可以正常运行。
尽管使用严格模式有如上这些的风险,但是只要使用得当,严格模式可以帮助开发者尽早发现一些潜在的问题。所以推荐在编写JavaScript代码时启用严格模式。
使用JSHint和JSLint
如果要更严格地编写JavaScript代码,可以使用JavaScript代码检查工具。目前,流行的检查工具主要是JSLint和JSHint。JSLint是JavaScript大牛Douglas Crockford所创立的。而JSHint则是从JSLint派生出来的,比JSLint更轻量级,并且它提供了一系列的可配置项,让开发者可关掉某些觉得没有必要的错误提示。JSHint使用起来更灵活,并不带有强制性的限制,所以推荐开发者使用。
JSHint的检查规则涵盖了大部分的基本编码规范,比如:缺少分号、空格和tab混合使用、错误的转义等。JSHint官方网站上列出了详细的检查项,每个检查项都有具体的解释,这些也是学习JavaScript基本规范的好资料。
很多的代码编辑器也集成了JSLint和JSHint这两个代码检查工具,比如在WebStorm代码编辑器的设置中就有针对此工具的单独配置项,配置界面如图所示。

图 WebStorm中配置JSLint和JSHint
在WebStorm中启用JSHint后,JavaScript代码文件中就会有进行JSHint检查的提示信息,如下图所示。

这样就可以很方便地找到代码中不够严谨或存在问题的地方。当然,如果不想使用IDE的插件,也可以使用一些自动化的工具,我最近一直在借助Grunt工具来构建和发布Web项目,grunt-contrib-jshint就是其中一个自动化的工具,此工具的运行效果图如下:

此工具配合grunt-contrib-watch 使用,会持续不断地检查JavaScript代码的质量。
如上就是在JavaScript编码中提高代码质量的一些基本手段,这些方式可以避免一些最基本的低级错误,并提高代码的可读性,但并不是说使用了严格模式和JSHint工具就能写出高质量的代码。高质量的代码还需要代码本身逻辑清晰,运行性能高,这些就需要开发者更深入地了解JavaScript语言特性。
Web前端开发最佳实践(11):使用更严格的JavaScript编码方式,提高代码质量的更多相关文章
- Web前端开发最佳实践(8):还没有给CSS样式排序?其实你可以更专业一些
前言 CSS样式排序是指按照一定的规则排列CSS样式属性的定义,排序并不会影响CSS样式的功能和性能,只是让代码看起来更加整洁.CSS代码的逻辑性并不强,一般的开发者写CSS样式也很随意,所以如果不借 ...
- Web前端开发最佳实践系列文章汇总
Web前端开发最佳实践(1):前端开发概述 Web前端开发最佳实践(2):前端代码重构 Web前端开发最佳实践(3):前端代码和资源的压缩与合并 Web前端开发最佳实践(4):在页面中添加必要的met ...
- 【社区公益】送《Web前端开发最佳实践》给需要的人
算起来至今,我进入软件开发行业已经有11年之久.从最初的研究人工智能,到后来的Web开发,控件开发,直到现在纯粹的Web前端开发.虽然没有大的作品问世,但也是勤勤恳恳,踏实做事,低调做人.从来不吹牛逼 ...
- Web前端开发最佳实践(9):CSS代码太太乱,重复代码太多?你需要精简CSS代码
前言 提高网站整体加载速度的一个重要手段就是提高代码文件的网络传输速度.之前提到过,所有的代码文件都应该是经过压缩了的,这可提高网络传输速度,提高性能.除了压缩代码之外,精简代码也是一种减小代码文件大 ...
- Web前端开发最佳实践(7):使用合理的技术方案来构建小图标
大家都对网站上使用的小图标肯定都不陌生,这些小图标作为网站内容的点缀,增加了网站的美观度,提高了用户体验,可是你有没有看过在这些网站中使用的图标都是用什么技术实现的?虽然大部分网站还是使用普通的图片实 ...
- Web前端开发最佳实践(1):前端开发概述
引言 我从07年开始进入博客园,从最开始阅读别人的文章到自己开始尝试表达一些自己对技术的看法.可以说,博客园是我参与技术讨论的一个主要的平台.在这其间,随着接触技术的广度和深度的增加,也写了一些得到了 ...
- Web前端开发最佳实践(4):在页面中添加必要的meta信息
meta标签放置在HTML页面的head中,主要用于标识网站.其中基本上包含了网站的一些描述信息,例如,简介.作者等.这些信息有助于搜索引擎更准确地识别网页的内容,也有助于第三方工具抓取网站基本信息. ...
- Web前端开发最佳实践(5):正确闭合HTML标签,停止使用不标准的标签和属性
正确闭合HTML标签 HTML元素的内容模型定义了元素的结构,表明元素可以包含哪些内容以及元素可以有哪些属性.元素可以包含的内容包括其他元素和字符,但是也有一些元素是空元素,即不能包含任何内容,这些元 ...
- Web前端开发最佳实践(6):过时的块状元素和行内元素
前言 前端程序员在学习HTML的过程中,肯定接触过页面元素的两个基本类型:块状元素和行内元素,也有大量的技术文章或者教程在介绍这两个概念.但这两个HTML元素相关的概念从字面上却和CSS样式有着很深的 ...
随机推荐
- NATS_11:NATS集群构建与验证
NATS服务集群化 NATS支持每一个服务按照集群模式方式运行.你可以将这些服务组织在一起形成一个集群来提高服务器的容量的消息传递系统,并可以提升整个系统的弹性话和高可用性. 注意,NATS集群服务器 ...
- 【转载】14个你可能不知道的 JavaScript 调试技巧
了解你的工具可以极大的帮助你完成任务.尽管 JavaScript 的调试非常麻烦,但在掌握了技巧 (tricks) 的情况下,你依然可以用尽量少的的时间解决这些错误 (errors) 和问题 (bug ...
- C#实现执行数据库事务案例
我是实际项目来拆出来做的案例,场景是比如我们在做电商网站时,在创建订单时的一系列操作,通常在创建订单时我们需要数据表的操作有:订单的表头(主表).订单的详细.清空购物车.甚至是修改优惠劵的状态(在使用 ...
- Fireworks基本使用
新建文件:ctrl+n 打开:ctrl+o 调出和隐藏标尺:ctrl+r 清除辅助线:视图.辅助线.清除辅助线 放大镜:z:放大镜状态下alt+左键:缩小 抓手:快捷键 测量距离:先拉出2根辅助线,然 ...
- Django 2.0.1 官方文档翻译: 快速安装向导 (Page5)
快速安装向导 (Page 5) 在你使用 Django 前,你需要先安装它.我们有一个完整的安装向导,它包含所有涉及的内容,这个向导会指导你进行一个简单的.最小化的安装,当你通过浏览介绍内容的时候,这 ...
- 【转载】 深度学习与自然语言处理(1)_斯坦福cs224d Lecture 1
版权声明:本文为博主原创文章,未经博主允许不得转载. 原文地址http://blog.csdn.net/longxinchen_ml/article/details/51567960 目录(?)[- ...
- iphone清除数字链接
<meta name="format-detection" content="telephone=no">
- 【算法】Base64编码
1.说明 Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法. 2.编码 ASCII码 -> 十六进制码 -> ...
- Redis—数据结构之list
Redis的列表对象底层所使用的数据结构其中之一就是list. list Redis的list是一个双端链表,其由3部分构成:链表节点.链表迭代器.链表.这一设计思想和STL的list是一样的,STL ...
- static, const 和 static const 变量的初始化问题
const 常量的在超出其作用域的时候会被释放,但是 static 静态变量在其作用域之外并没有释放,只是不能访问. static 修饰的是静态变量,静态函数.对于类来说,静态成员和静态函数是属于整个 ...