热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

JS复习整理12_优化

一.可维护性优化1.添加注释注释能够增强代码的可读性以及可维护性,当然,理想情况是满满的注释,但这不太现实。所以我们只需要在一些关键的地

一.可维护性优化

1.添加注释
注释能够增强代码的可读性以及可维护性,当然,理想情况是满满的注释,但这不太现实。所以我们只需要在一些关键的地方添上注释:


函数和方法:尤其是返回值,因为直接看不出来

大段代码(功能模块):说明模块功能

复杂算法:写出关键点,方便理解

Hack:说明为了修复什么问题,当前方案是否完善,能否改进


2.“暗示”变量类型
通过初始值来暗示,例如:

var found = false;
var count = 1;
var name = '';
var student = null;

3.解耦(分层)
结构层:HTML


行为层:JS

表现层:CSS

尽量不要“越权”,如果实在是想越权,也应该用文档或者注释说明。尽量不要出现紧耦合,例如:

JS-HTML:


elem.innerHTML = '

title

content

';
//最好用下面的方式代替(显示页面中的隐藏元素)
//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 &#61; 0;i < 2;i&#43;&#43;){process(arr[i]);
}
//下面的比上面的快
process(arr[0]);
process(arr[1]);
process(arr[2]);

如果循环次数不能确定&#xff0c;可以用Duff技术&#xff08;Tom Duff发明的&#xff09;展开一部分循环&#xff0c;提高效率&#xff0c;例如&#xff1a;

//credit: Jeff Greenberg for JS implementation of Duff’s Device
//假设 values.length > 0
var iterations &#61; Math.ceil(values.length / 8);
var startAt &#61; values.length % 8;
var i &#61; 0;
do {switch(startAt){case 0: process(values[i&#43;&#43;]);case 7: process(values[i&#43;&#43;]);case 6: process(values[i&#43;&#43;]);case 5: process(values[i&#43;&#43;]);case 4: process(values[i&#43;&#43;]);case 3: process(values[i&#43;&#43;]);case 2: process(values[i&#43;&#43;]);case 1: process(values[i&#43;&#43;]);}startAt &#61; 0;
} while (--iterations > 0);
//以上代码来自&#xff1a;http://www.cnblogs.com/kylindai/archive/2013/12/04/3458476.html

或者另一个更快的Duff方法&#xff1a;

//credit: Speed Up Your Site (New Riders, 2003)
var iterations &#61; Math.floor(values.length / 8);
var leftover &#61; values.length % 8;
var i &#61; 0;
if (leftover > 0){do {process(values[i&#43;&#43;]);} while (--leftover > 0);
}
do {process(values[i&#43;&#43;]);process(values[i&#43;&#43;]);process(values[i&#43;&#43;]);process(values[i&#43;&#43;]);process(values[i&#43;&#43;]);process(values[i&#43;&#43;]);process(values[i&#43;&#43;]);process(values[i&#43;&#43;]);
} while (--iterations > 0);
//以上代码来自&#xff1a;http://www.cnblogs.com/kylindai/archive/2013/12/04/3458476.html

④避免双重解释

双重解释是指&#xff1a;用js解析js。具体是用eval()函数或者new Function(strCode)或者setTimeout(strCode)

双重解释的缺点&#xff1a;需要再启动一个解析器来解析&#xff0c;存在很大的开销&#xff0c;比直接解析慢很多

⑤原生方法更快

原生方法是用用C/C&#43;&#43;编译好的模块&#xff0c;所以要快得多

⑥switch比if-else快

原因不好说&#xff0c;可以参考

⑦位运算并没有更快

在其它语言中把数学运算简化为位运算能够提升计算速度&#xff0c;但js中没这一说&#xff0c;因为js内部只有一种数值类型&#xff08;double&#xff09;&#xff0c;所以做位运算需要折腾&#xff1a;double – int – 做位运算 – double&#xff0c;性能可想而知

⑧减少语句数量


用1个var声明多个变量

插入迭代值&#xff0c;arr[i&#43;&#43;]一条语句搞定&#xff0c;不用把i&#43;&#43;独立成一个语句

用数组/对象字面量&#xff0c;代码行数明显变少了


⑨DOM优化


减少现场更新&#xff0c;可以用DocumentFragment优化

用innerHTML创建DOM节点比创建一堆节点再组装要快&#xff0c;但存在JS-HTML耦合问题&#xff0c;慎重考虑

用事件委托

注意实时更新的集合&#xff08;NodeList、NamedNodeMap、HTMLCollection&#xff09;

除了把引用另存为局部变量外&#xff0c;还要注意访问其属性也是需要重新查询的&#xff0c;比如&#xff1a;var imgs &#61;
document.images;访问imgs.length也需要再查一次



三.发布优化

①用验证工具&#xff08;如JSLint&#xff09;检查代码&#xff0c;发现语法错误之外的潜在问题

②去掉注释&#xff08;出于安全性考虑&#xff09;

③合并js文件&#xff0c;尽量减少外部文件数量

④压缩代码&#xff08;如YUI压缩器&#xff09;&#xff0c;减少代码本身大小&#xff0c;也可以同时混淆代码&#xff0c;提高安全性&#xff0c;但混淆代码本身存在风险&#xff0c;可能引发错误

⑤开启服务器压缩功能&#xff0c;例如gzip模块


推荐阅读
  • 本文探讨了2019年前端技术的发展趋势,包括工具化、配置化和泛前端化等方面,并提供了详细的学习路线和职业规划建议。 ... [详细]
  • EasyMock实战指南
    本文介绍了如何使用EasyMock进行单元测试,特别是当测试对象的合作者依赖于外部资源或尚未实现时。通过具体的示例,展示了EasyMock在模拟对象行为方面的强大功能。 ... [详细]
  • VMware Horizon View 5.0桌面虚拟化部署实践与心得
    在近期的研究中,我花费了大约两天时间成功部署了桌面虚拟化环境,并在此过程中积累了一些宝贵的经验。本文将分享这些经验和部署细节,希望能对同样关注桌面虚拟化的同行有所帮助。 ... [详细]
  • 探讨 HDU 1536 题目,即 S-Nim 游戏的博弈策略。通过 SG 函数分析游戏胜负的关键,并介绍如何编程实现解决方案。 ... [详细]
  • 通常情况下,修改my.cnf配置文件后需要重启MySQL服务才能使新参数生效。然而,通过特定命令可以在不重启服务的情况下实现配置的即时更新。本文将详细介绍如何在线调整MySQL配置,并验证其有效性。 ... [详细]
  • Python自动化测试入门:Selenium环境搭建
    本文详细介绍如何在Python环境中安装和配置Selenium,包括开发工具PyCharm的安装、Python环境的设置以及Selenium包的安装方法。此外,还提供了编写和运行第一个自动化测试脚本的步骤。 ... [详细]
  • 本题要求在一组数中反复取出两个数相加,并将结果放回数组中,最终求出最小的总加法代价。这是一个经典的哈夫曼编码问题,利用贪心算法可以有效地解决。 ... [详细]
  • Spring Boot 中静态资源映射详解
    本文深入探讨了 Spring Boot 如何简化 Web 应用中的静态资源管理,包括默认的静态资源映射规则、WebJars 的使用以及静态首页的处理方法。通过本文,您将了解如何高效地管理和引用静态资源。 ... [详细]
  • 本文探讨了C++编程中理解代码执行期间复杂度的挑战,特别是编译器在程序运行时生成额外指令以确保对象构造、内存管理、类型转换及临时对象创建的安全性。 ... [详细]
  • 深入探讨Web页面中的锚点交互设计
    本文旨在分享Web前端开发中关于网页锚点效果的实现与优化技巧。随着Web技术的发展,越来越多的企业开始重视前端开发的质量和用户体验,而锚点功能作为提升用户浏览体验的重要手段之一,值得深入研究。 ... [详细]
  • 本文详细介绍了 Android 开发中 layout_gravity 属性的使用方法及其在不同布局下的效果,旨在帮助开发者更好地理解和利用这一属性来精确控制视图的布局。 ... [详细]
  • 本文深入探讨了JavaScript中实现继承的四种常见方法,包括原型链继承、构造函数继承、组合继承和寄生组合继承。对于正在学习或从事Web前端开发的技术人员来说,理解这些继承模式对于提高代码质量和维护性至关重要。 ... [详细]
  • 本文档详细介绍了Scrapy框架中的信号系统,包括如何利用信号来增强爬虫的功能性和灵活性,以及各个内置信号的具体用途和参数。 ... [详细]
  • Java Servlet中获取客户端IP与MAC地址的方法
    本文介绍了一种在Java Servlet应用中获取客户端IP地址及MAC地址的技术实现方法,通过示例代码详细解析了获取过程中的关键步骤和技术点。 ... [详细]
  • Android中解析XML文件的实践指南
    本文详细介绍了在Android应用开发中解析XML文件的方法,包括从本地文件和网络资源获取XML文件的不同途径,以及使用DOM、SAX和PULL三种解析方式的具体实现。 ... [详细]
author-avatar
白变小樱啊
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有