《编写可维护的javascript》读书笔记(中)——编程实践
上篇读书笔记系列之:《编写可维护的javascript》读书笔记(上)
上篇说的是编程风格,记录的都是最重要的点,不讲废话,写的比较简洁,而本篇将加入一些实例,因为那样比较容易说明问题。
二、编程实践
1、UI松耦合
第一、将css从javascript中抽离(要改变dom样式数据,应该去操作dom的class名而非dom的style属性,后续要修改此样式只需到对应的css文件中修改而不用修改js文件);
第二、将javascript从HTML中抽离,比如下面的写法是不好的
<!-- 不好的写法 -->
<input type="button" onclick="doSomething" />
js应该放在外部文件中,方便维护;
第三、避免使用css表达式,严重影响页面性能;
第四、将HTML从javascript中抽离,比如你要动态生成一个N行4列的表格,表头和tbody可以写死在页面里,表体你可能会这样循环生成
// 不好的写法
var str="";
for (var i = 0; i < data.length; i++) {
str+="<tr><td>"+ data[i].字段一 +"</td><td>"+ data[i].字段二 +
"</td><td>"+ data[i].字段三 +"</td><td>"+ data[i].字段四 +"</td></tr>";
};
$("tbody").html(str);
假如现在要增加一个字段,将表格的列数增加到5列,你要先到html页面修改表头,又要到js里修改js文件……所以,尽量将html从js中分离出去是好的做法,可以在html里面写一个模板,通过js获取模板内容替换变量生成html填充到tbody里面。
2、避免使用全局变量
命名本身就是一件比较困难的事,如果大量使用全局变量,随着代码量不断增加,命名冲突概率随之增高,程序维护成本也随着增高。
3、事件处理
规则1:隔离应用逻辑
什么意思呢?好比电脑要关机,有个关机的程序放在那里,你可以按关机按钮触发关机程序,也可以点开始菜单再选择关机去触发关机程序,这个关机程序是独立出来的。代码也是如此,当点击按钮A或按钮B要做的操作是一样的时候,应该将操作独立写成一个函数,这就是应用逻辑隔离。
规则2:不要分发事件对象
先看一段代码
function handleClick(event){
var popup = document.getElementById("popup");
popup.style.left = event.clientX + "px";
popup.style.top= event.clientY + "px";
popup.className = "reveal";
} document.getElementById("demo").onclick=function(event){
handleClick(event);
};
上面这段代码中,event被无节制地分发,它从事件处理函数中传入handClick(),event对象上包含很多信息,而handClick函数内只用到了其中2个而已,该函数并没有标明哪些数据是必要的,假如此时你也要调用这个方法,你必须创建一个evnet对象并将它作为参数传入,而你依然不知道这个方法使用了哪些信息,我们可以做如下修改
function handleClick(x,y){
var popup = document.getElementById("popup");
popup.style.left = x + "px";
popup.style.top = y + "px";
popup.className = "reveal";
} document.getElementById("demo").onclick=function(event){
handleClick(event.clientX,event.clientY);
};
4、避免“空比较”
有时候我们需要检测函数的某个参数是否存在,可能会通过判断这个参数是否等于null来判断出参数是否存在
var comtroller = {
process:function(items){
if(items!==null){ // 不好的写法
items.sort();
// 执行一些逻辑
}
}
}
这段代码中,process方法显然希望items是一个数组,然后当items的值为1时,不等于null,依然进入if语句内了,执行到items.sort()就报错了
5、检测原始值(string、number、boolean、undefined、null),typeof就够了
6、检测引用值(Object、Array、Date、Error),引用值也称做对象,一般情况下使用instanceof来检测这个对象的构造器是否为对应的值即可,当跨域检测时,用instanceof检测数组将失败,解决方案是将该对象的原型调用toString()方法,判断返回的字符串是否等于[object Array]来得出结论:
// 判断value是否为数组
function isArray(value){
return Object.prototype.toString.call(value)==="[object Array]";
}
7、检测函数 用typeof即可,可以跨帧使用,返回"function",在IE8和更早版本的IE中,使用typeof检测DOM节点中的函数(如getElementById())都返回“Objeac”而不是“function”
8、检测属性
// 不好的写法
if(object[propertyName]){
// 存在属性propertyName
}
// 不好的写法
if(object[propertyName]!= null){
// 存在属性propertyName
}
// 不好的写法
if(object[propertyName]!= undefined){
// 存在属性propertyName
}
上面这段代码中,假如属性值为假值(false、0、null、undefined)时会出错,判断属性是否存在的最好方法是使用in运算符,in运算符仅仅会简单地判断属性是否存在,而不会去读取属性的值。
var object = {
count: 0
}
// 好的写法
if( "count" in object ){
// 这里的代码会执行
}
// 不好的写法
if( object["count"] ){
// 这里的代码不会执行
}
9、将配置数据从代码中分离出来
什么是配置数据?比如页面中做某个操作失败,需要一个提示语,而不同的操作有不同的提示语,此时整个提示语就是配置数据。应该将配置数据分离出来以参数的形式传进去。
10、抛出自定义错误 throw new Error("错误提示")
在代码执行过程中出错时,如果没有任何提示或是提示比较稀少、隐晦,调试是非常困难的,而抛出自定义错误,就是在有可能出错的地方,加上捕获错误的代码抛出错误,将非常有利于调试。抛出自己的错误可以使用确切的文本供浏览器显示,可以包括出错的行数、函数以及失败原因,有利于快速定位错误原因。
ECMA-262规范指出了7种错误类型
1)Error : 所有错误的基本类型
2)EvalError : 通过eval()函数执行代码出错时抛出
3)RangeError : 一个数字超出了它的边界时抛出,比如试图创建一个长度为-20的数组(new Array(-20))。
4)ReferenceError: 期望的对象不存在时抛出,比如试图在一个null对象引用上调用一个函数
5)SyntaxError: 语法错误
6)TypeError: 变量不是期望的类型时抛出错误
7)URIError: 给encodeURI()、encodeURIComponent()、decodeURI()、decodeURIComponent()等函数传递格式非法的URI字符串时抛出
这7种错误类型需要熟记。
11、不是你的对象不要动
开发过程中,可能会引用一些javascript类库,你个人不是这些类库的作者,应该遵守3条基本原则
1)不覆盖方法
2)不新增方法
3)不删除方法
12、浏览器嗅探
避免浏览器推断
现在有一种比较流行的判断IE浏览器的方法是
if( document.all ){
// IE浏览器
}
这就属于浏览器推断,这个推断断定document.all只存在于IE浏览器,而实际上Opera的一些版本也支持document.all
做特性检测
我们知道IE9及以下的IE浏览器不支持placeholder属性,当我们要给IE9及以下浏览器模拟placeholder效果时,需要先做特性检测,如果浏览器不支持placeholder属性才用js去模拟
if( !("placeholder" in document.createElement("input")) ){
// 不支持placeholder,需要模拟
}
第二部分完。
by:王美建 from:http://www.cnblogs.com/wangmeijian
原创文章,转载请注明出处
《编写可维护的javascript》读书笔记(中)——编程实践的更多相关文章
- 编写可维护的Javascript读书笔记
写在前面:之前硬着头皮参加了java方面的编程规范培训,收货良多,工作半年有余的时候,总算感觉到一丝丝Coding之美,以及造轮子的乐趣,以至于后面开发新功能的时候,在Coding style方面花了 ...
- 《编写可维护的JavaScript》 笔记
<编写可维护的JavaScript> 笔记 我的github iSAM2016 概述 本书的一开始介绍了大量的编码规范,并且给出了最佳和错误的范例,大部分在网上的编码规范看过,就不在赘述 ...
- 编写可维护的javascript阅读笔记
格式 变量 变量命名, 采取小驼峰大小写 变量使用名词, 函数前缀为动词 局部变量应统一定义在函数的最上面, 而不是散落在函数的任意角落. 赋初始值的定义在未赋初始值的变量的上面. 我个人建议不使用单 ...
- 读《编写可维护的javascript》笔记
第一章 基本的格式化 缩进层级:推荐 tab:4; 换行:在运算符后面换行,第二行追加两个缩进: // Good: Break after operator, following line inden ...
- 【读书笔记】读《编写可维护的JavaScript》 - 编程实践(第二部分)
本书的第二个部分总结了有关编程实践相关的内容,每一个章节都非常不错,捡取了其中5个章节的内容.对大家组织高维护性的代码具有辅导作用. 5个章节如下—— 一.UI层的松耦合 二.避免使用全局变量 三.事 ...
- 《编写可维护的javascript》读书笔记(上)
最近在读<编写可维护的javascript>这本书,为了加深记忆,简单做个笔记,同时也让没有读过的同学有一个大概的了解. 一.编程风格 程序是写给人读的,所以一个团队的编程风格要保持一致. ...
- 编写可维护的JavaScript代码(部分)
平时使用的时VS来进行代码的书写,VS会自动的将代码格式化,所有写了这么久的JS代码,也没有注意到这些点.看了<编写可维护的javascript代码>之后,做了些笔记. var resul ...
- 《编写可维护的JavaScript》之编程实践
最近读完<编写可维护的JavaScript>,让我受益匪浅,它指明了编码过程中,需要注意的方方面面,在团队协作中特别有用,可维护性是一个非常大的话题,这本书是一个不错的起点. 本书虽短,却 ...
- 编写可维护的JavaScript 收纳架
如果你看过Nicolas C.Zakas写过的任何作品,你必须承认他是个不折不扣的天才.也只有天才级的才能写出<JavaScript高级程序设计>让所有的前端攻城师人手一本.Nicolas ...
随机推荐
- oracle执行update语句时卡住问题分析及解决办法
转载:http://www.jb51.net/article/125754.htm 这篇文章主要介绍了oracle执行update语句时卡住问题分析及解决办法,涉及记录锁等相关知识,具有一定参考价值, ...
- Random Projection在k-means的应用
1. 随机投影 (Random Projection) 首先,这是一种降维方法.之前已经介绍过相对普遍的PCA的降维方法,这里介绍另一种降维方法Random Project.相比于PCA,他的优势可以 ...
- map文件的使用
map文件相信大家并不陌生,大家都知道是用来调试的,但是具体怎么用你又清不清楚呢? 其实也很简单 1.拿JQ为例,我们需要备有jquery.js.jquery.min.js.jquery.min.ma ...
- HTTP header location 重定向 URL
http头信息 头信息的作用很多,最主要的有下面几个:1.跳转当浏览器接受到头信息中的 Location: xxxx 后,就会自动跳转到 xxxx 指向的URL地址,这点有点类似用 js 写跳转.但是 ...
- Linux命令(六)Linux超级用户和管理组
修改文件目录的所属组
- Java面试题系列(一)描述一下JVM加载class文件的原理机制
JVM系列第4讲:从源代码到机器码,发生了什么? https://www.cnblogs.com/chanshuyi/p/jvm_serial_04_from_source_code_to_machi ...
- es6笔记(4) Set数据结构
概要 介绍: 集合是由一组无序且唯一的项组成的,这个数据结构使用了与有限集合相同的数学概念,应用在计算机的数据结构中. ES6提供了数据结构Set.它类似于数组,但是没有重复的值. 特点: key与v ...
- 第8月第15天 app支持后台播放
1. AVAudioSession *audioSession = [AVAudioSession sharedInstance]; //默认情况下扬声器播放 [audioSession setCat ...
- nginx配置thinkphp5
[root@z_centos nginx]# /usr/local/nginx/sbin/nginx -hnginx version: nginx/1.13.9thinkphp 5.0.18 [roo ...
- SVM Kernel Functions
==================================================================== This article came from here. Th ...