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样式有着很深的 ...
随机推荐
- Docker镜像构建(五)
Docker 镜像介绍 Docker镜像构建分为两种,一种是手动构建,另一种是Dockerfile(自动构建) 手动构建docker镜像 案例:我们基于centos镜像进行构建,制作自己的nginx镜 ...
- python---基础知识回顾(五)(python2.7和python3.5中的编码)
Unicode 和 UTF-8 有何区别? python基础之字符编码 以上两篇看懂即可,那下面的就不需要看了 python标准数据类型 Bytes python--数据类型bytes Python ...
- 2016/1/2 Python中的多线程(1):线程初探
---恢复内容开始--- 新年第一篇,继续Python. 先来简单介绍线程和进程. 计算机刚开始发展的时候,程序都是从头到尾独占式地使用所有的内存和硬件资源,每个计算机只能同时跑一个程序.后来引进了一 ...
- Mongodb开启远程连接并认证
环境: Mongodb版本:3.4.6 步骤: 1. mongo创建管理员: 在mongo shell下: use admin db.createUser( { user: "testus ...
- PHP 神盾解密工具
前两天分析了神盾的解密过程所用到的知识点,昨晚我把工具整理了下,顺便用神盾加密了.这都是昨天说好的,下面看下调用方法吧. 先下载 decryption.zip然后解压放到一个文件夹里,把你要解密的文件 ...
- 网上整理的jQuery插件开发教程
jQuery插件的开发包括两种:一种是类级别的插件开发,即给jQuery添加新的全局函数,相当于给jQuery类本身添加方法.jQuery的全局函数就是属于jQuery命名空间的函数,另一种是对象级别 ...
- POJ 1185 炮兵阵地 (状态压缩DP)
题目链接 Description 司令部的将军们打算在NM的网格地图上部署他们的炮兵部队.一个NM的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示),也可能是平原(用& ...
- Nginx配置location及rewrite规则
Nginx配置location及rewrite规则 示例: location = / { # 精确匹配 / ,主机名后面不能带任何字符串 [ configuration A ] } loca ...
- std::max 错误
Today I typed the following: int t = (std::max)(timeout, lagtime); Why did I put parentheses around ...
- Python标准库笔记(11) — Operator模块
Operator--标准功能性操作符接口. 代码中使用迭代器时,有时必须要为一个简单表达式创建函数.有些情况这些函数可以用一个lambda函数实现,但是对于某些操作,根本没必要去写一个新的函数.因此o ...