JS学习笔记12_优化
一.可维护性优化
1.添加注释
注释能够增强代码的可读性以及可维护性,当然,理想情况是满满的注释,但这不太现实。所以我们只需要在一些关键的地方添上注释:
函数和方法:尤其是返回值,因为直接看不出来
大段代码(功能模块):说明模块功能
复杂算法:写出关键点,方便理解
Hack:说明为了修复什么问题,当前方案是否完善,能否改进
2.“暗示”变量类型
通过初始值来暗示,例如:
var found = false;
var count = 1;
var name = '';
var student = null;
3.解耦(分层)
结构层:HTML
行为层:JS
表现层:CSS
尽量不要“越权”,如果实在是想越权,也应该用文档或者注释说明。尽量不要出现紧耦合,例如:
JS-HTML:
elem.innerHTML = '<div class="block"><h2>title</h2><p>content</p></div>';
//最好用下面的方式代替(显示页面中的隐藏元素)
//elem.style.display = 'block';JS-CSS:
elem.style.color = '#e0e0e0';
//最好用下面的方式代替(设置类,不要直接设置样式)
//elem.className = 'my_class';JS-JS:
//逻辑耦合
elem.onclick = function(e){
if(txt.value !== null && txt.value !== '' &&...){
//DOM操作
}
}
//最好用下面的方式代替(分离逻辑功能块)
function isValid(){
return txt.value !== null && txt.value !== '' &&...;
}
function display(){
//DOM操作
}
elem.onclick = function(e){
if(isValid()){
display();
}
}避免逻辑耦合的几条原则:
不要传递event对象,只传需要的数据
触发事件不应该是执行动作的唯一方式
事件处理器应该只处理事件相关数据(获取事件源,坐标值等等),然后把处理转交给应用逻辑
4.编码原则
尊重对象所有权,不要随便修改别人的对象,具体要求:
不要给实例/原型添加属性或方法
不要重写已存在的方法
可选方案:
组合:创建实现了所需功能的新对象,引用需要的对象
继承:创建自定义类型,继承需要修改的类型,然后添加额外功能
用命名空间避免全局变量,例如:
var mySystem = {};
mySystem.mod1 = {...};用常量提高可维护性,例如:
var Consts = {};
Consts.IMG_PATH = '../imgs/';注意:常量包括常用的CSS类名和其它任何可能影响维护的值
二.性能优化
1.避免长作用域链查找
把需要多次引用的全局变量另存为局部变量
2.尽量不要用with语句
with语句会延长作用域,存在长作用域查找的开销,可以用另存局部变量来代替(没有with方便,但多少能好一点)
3.避免不必要的属性查找
尽量把重复使用的值另存为局部变量,例如:
//不要用下面的代码(6次属性查找)
var qs = window.location.href.substring(window.location.href.indexOf('?'));
//应该用下面的代码(4次,而且更具可读性)
var url = window.location.href;
var qs = url.substring(url.indexOf('?'));优化循环
减值迭代更快(i–)
简化终止条件,每次循环都会检查终止条件,简化条件能提高效率
简化循环体,尽量减少循环体里面的计算量
使用后测试循环(do...while),可以避免第一次循环前的判断
展开循环
如果循环次数确定,最好不要用循环,因为循环存在创建循环和处理终止条件的额外开销,例如:
for(i = 0;i < 2;i++){
process(arr[i]);
}
//下面的比上面的快
process(arr[0]);
process(arr[1]);
process(arr[2]);如果循环次数不能确定,可以用Duff技术(Tom Duff发明的)展开一部分循环,提高效率,例如:
//credit: Jeff Greenberg for JS implementation of Duff’s Device
//假设 values.length > 0
var iterations = Math.ceil(values.length / 8);
var startAt = values.length % 8;
var i = 0;
do {
switch(startAt){
case 0: process(values[i++]);
case 7: process(values[i++]);
case 6: process(values[i++]);
case 5: process(values[i++]);
case 4: process(values[i++]);
case 3: process(values[i++]);
case 2: process(values[i++]);
case 1: process(values[i++]);
}
startAt = 0;
} while (--iterations > 0);
//以上代码来自:http://www.cnblogs.com/kylindai/archive/2013/12/04/3458476.html或者另一个更快的Duff方法:
//credit: Speed Up Your Site (New Riders, 2003)
var iterations = Math.floor(values.length / 8);
var leftover = values.length % 8;
var i = 0;
if (leftover > 0){
do {
process(values[i++]);
} while (--leftover > 0);
}
do {
process(values[i++]);
process(values[i++]);
process(values[i++]);
process(values[i++]);
process(values[i++]);
process(values[i++]);
process(values[i++]);
process(values[i++]);
} while (--iterations > 0);
//以上代码来自:http://www.cnblogs.com/kylindai/archive/2013/12/04/3458476.html避免双重解释
双重解释是指:用js解析js。具体是用eval()函数或者new Function(strCode)或者setTimeout(strCode)
双重解释的缺点:需要再启动一个解析器来解析,存在很大的开销,比直接解析慢很多
原生方法更快
原生方法是用用C/C++编译好的模块,所以要快得多
switch比if-else快
原因不好说,可以参考CSDN
位运算并没有更快
在其它语言中把数学运算简化为位运算能够提升计算速度,但js中没这一说,因为js内部只有一种数值类型(double),所以做位运算需要折腾:double – int – 做位运算 – double,性能可想而知
减少语句数量
用1个var声明多个变量
插入迭代值,arr[i++]一条语句搞定,不用把i++独立成一个语句
用数组/对象字面量,代码行数明显变少了
DOM优化
减少现场更新,可以用DocumentFragment优化
用innerHTML创建DOM节点比创建一堆节点再组装要快,但存在JS-HTML耦合问题,慎重考虑
用事件委托
注意实时更新的集合(NodeList、NamedNodeMap、HTMLCollection)
除了把引用另存为局部变量外,还要注意访问其属性也是需要重新查询的,比如:var imgs = document.images;访问imgs.length也需要再查一次
三.发布优化
用验证工具(如JSLint)检查代码,发现语法错误之外的潜在问题
去掉注释(出于安全性考虑)
合并js文件,尽量减少外部文件数量
压缩代码(如YUI压缩器),减少代码本身大小,也可以同时混淆代码,提高安全性,但混淆代码本身存在风险,可能引发错误
开启服务器压缩功能,例如gzip模块
JS学习笔记12_优化的更多相关文章
- JS学习笔记5_DOM
1.DOM节点的常用属性(所有节点都支持) nodeType:元素1,属性2,文本3 nodeName:元素标签名的大写形式 nodeValue:元素节点为null,文本节点为文本内容,属性节点为属性 ...
- js学习笔记:webpack基础入门(一)
之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...
- Vue.js学习笔记(2)vue-router
vue中vue-router的使用:
- JS 学习笔记--9---变量-作用域-内存相关
JS 中变量和其它语言中变量最大的区别就是,JS 是松散型语言,决定了它只是在某一个特定时间保存某一特定的值的一个名字而已.由于在定义变量的时候不需要显示规定必须保存某种类型的值,故变量的值以及保存的 ...
- WebGL three.js学习笔记 使用粒子系统模拟时空隧道(虫洞)
WebGL three.js学习笔记 使用粒子系统模拟时空隧道 本例的运行结果如图: 时空隧道demo演示 Demo地址:https://nsytsqdtn.github.io/demo/sprite ...
- WebGL three.js学习笔记 法向量网格材质MeshNormalMaterial的介绍和创建360度全景天空盒的方法
WebGL学习----Three.js学习笔记(5) 点击查看demo演示 Demo地址:https://nsytsqdtn.github.io/demo/360/360 简单网格材质 MeshNor ...
- WebGL three.js学习笔记 创建three.js代码的基本框架
WebGL学习----Three.js学习笔记(1) webgl介绍 WebGL是一种3D绘图协议,它把JavaScript和OpenGL ES 2.0结合在一起,通过增加OpenGL ES 2.0的 ...
- vue.js 学习笔记3——TypeScript
目录 vue.js 学习笔记3--TypeScript 工具 基础类型 数组 元组 枚举 字面量 接口 类类型 类类型要素 函数 函数参数 this对象和类型 重载 迭代器 Symbol.iterat ...
- 2019-4-29 js学习笔记
js学习笔记一:js数据类型 1:基本数据类型 number类型(整数,小数) String类型 boolean类型 NaN类型其实是一个nu ...
随机推荐
- linux进程及进程控制
Linux进程控制 程序是一组可执行的静态指令集,而进程(process)是一个执行中的程序实例.利用分时技术,在Linux操作系统上同时可以运行多个进程.分时技术的基本原理是把CPU的运行时间划 ...
- javascript作用域和作用域链摘录
作用域是JavaScript最重要的概念之一,想要学好JavaScript就需要理解JavaScript作用域和作用域链的工作原理.今天这篇文章对JavaScript作用域和作用域链作简单的介绍,希望 ...
- C++ JsonCpp 使用(含源码下载)
C++ JsonCpp 使用(含源码下载) 前言 JSON是一个轻量级的数据定义格式,比起XML易学易用,而扩展功能不比XML差多少,用之进行数据交换是一个很好的选择JSON的全称为:JavaScri ...
- IE 下JS和CSS 阻塞后面内容总结
总结: 1. CSS 都是可以并行下载的. 2. IE6 和 IE7 JS 不能并行下载,CSS 和 JS 阻塞后面内容下载. 3. IE8 JS 还是会阻塞图片下载 开始改变加载模式, ...
- HDU 5410 CRB and His Birthday(完全背包变形)
CRB and His Birthday Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Oth ...
- vertical-align 属性设置元素的垂直对齐方式。
值 描述 baseline 默认.元素放置在父元素的基线上. sub 垂直对齐文本的下标. super 垂直对齐文本的上标 top 把元素的顶端与行中最高元素的顶端对齐 text-top 把元素的顶 ...
- scala 学习: case class
case class: 1.定义为case class 的类在实例化时,可以不使用new 关键字. case class People(name:String, age:Int) val zhangs ...
- linux shell 去掉文本处理中的双引号
cat aa.txt |sed 's/\"//g' 结果是:hello aa.txt "hello"
- 记一次 Ubuntu 使用 arptables 抵御局域网 ARP 攻击
. . . . . 前段时间大概有一个月左右,租房的网络每天都断一次,每次断大概一两分钟左右就恢复了,所以没太在意.直到有一天晚上,LZ 正在写博客,但是网络频繁中断又重新连上再中断.待 LZ 好不容 ...
- dynamic2016 crm 安装语言包提示缺少组件报错
当安装dynamic2016 CRM英文语言包安装成功后,在系统切换语言的时候提示如下报错为缺少CRM reporting extensions 插件导致,在CRM的解压安装包如下路径找到对应的执行文 ...