实现高性能javascript的注意事项


Posted in Javascript onMay 27, 2019

1.少用全局变量

原因:因为作用域链是一个堆栈的结构,所以遵循先进先出的原则,而javascript引擎在解析代码的时候,将全局对象放在栈底,然后向上依次出现的是不同作用域的活动对象(这些活动对象除了闭包没有相互依赖的关系),所以在查找变量的时候会从该活动对象开始,然后是闭包它的活动对象,最后是全局对象,如果全局变量过多就会影响获得变量时的速度,所以不要过多使用全局变量。

2.尽量使用局部变量封装全局变量

原因:正如前面所说,活动对象在栈的顶端,所以最先查找它的内容,当我们将document封装成局部变量后就会减少深层次查找的次数,使性能提高。

3.操作数组长度、对象属性时,尽量使用局部变量封装。

原因:IE、opera存取数组比对象属性快,而FF chrome safari正好相反,所以兼顾这些,我们最好封装一下。

4.尽量减少对象属性的深度

原因:深度太大,会增加javascript引擎对取得值的地址查找的开销,相当于增加了多层嵌套的指针,导致性能损失。

5.在for循环中尽量使用局部变量封装条件项

原因:例如for(var i=0;i<divs.length;i++) 的时候,如果divs为document.getElementsByTagName('div'),这样在每次循环判断条件的时候都会对DOM文档进行一次遍历求得长度,所以讲length封装起来,会提升性能。

6.谨慎的处理HTMLcollection对象(比如childNodes getElementsByTagName等取得DOM元素集合的对象),最好将其封装到数组里操作。

原因:还是因为操作DOM元素需要遍历DOM文档,而非DOM元素则不用遍历,所以请尽量减少对DOM的操作,而将DOM集合放到数组中去。

7.在针对safari浏览器的开发过程中,请尽量使用“.”获取对象属性而不是用“[]”。

8.建议在少于两次判断的环境下使用if-else,而大于三次的就用switch吧。而超过10次的时候,还是使用数组或json对象来通过索引来查找吧(这种模式相对简单)

9.如果循环数组的顺序从低到高或从高到低没有差别,那么还是从高到低比较好,比如我们循环输出一个数组中的内容:

var arr=[1,2,3,4,5];
var i=0;
while(i<arr.length){
alert(arr[i]);
}//这样开销会比较大,因为每次都要遍历求出数组元素的长度
//----------------------------------
var i=arr.length;
while(i--){
alert(arr[i]);
}//使用局部变量保存数组长度,然后该变量自减,连while中的判断都省了,因为0转换为布尔值就是false。

10.尽量少使用for-in循环,将其尽量改造成while 或for循环。

11.处理大数组时,请遵循duff策略。

duff策略:将大数组的个数拆分成8个一组,对这8个为一个单位的数组的操作不用循环处理,而是不怕繁琐的写出8行处理数组元素的代码,这样会提升大数组操作的性能。

12.用函数处理大数组的每个元素时,尽量使用定时器将每次操作挂起,时间设定在50-100ms比较合理

原因:如果简单的用循环来处理数组中的每个元素,如果是大数组,会造成页面的冻结和假死,给用户不好的体验,而用setTimeout,就会把每次操作都暂时挂起,让javascript引擎有其他的时间去处理队列中的其他函数,有效的防止了冻结和假死,而在设定的延迟时间之后,有可能javascript引擎是空闲的状态,可以更好的处理这些数组操作。相当于虚拟了一个后台操作。下面是zakas提出的解决方案:

function chunk(array,func,context){
setTimeout(function(){
var arr=array.shift();
func.call(context,item);
if(array.length>0){
setTimeout(arguments.callee,100);//递归循环这个过程 arguments.callee为chunk这个函数对象
}
},100);
}

13.在使用iframe的时候注意window onload的阻塞

原因:iframe的加载会对window onload进行阻塞,导致有些window unload事件中加载的代码在用户关掉页面的时候可能不被执行,所以需要我们最好在window onload时间发生时动态为iframe设定src属性。

PS:能不用iframe就不用。

14.CSS选择符的优化

原因:CSS选择符的读取方式为从右至左,所以在写的时候尽可能右边规则详细,而且尽量少用子选择符合后代选择符标签选择符。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
js防止表单重复提交的两种方法
Sep 30 Javascript
JSON格式的键盘编码对照表
Jan 29 Javascript
javascript检查某个元素在数组中的索引值
Mar 30 Javascript
JavaScript中全选、全不选、反选、无刷新删除、批量删除、即点即改入库(在yii框架中操作)的代码分享
Nov 01 Javascript
javascript实现二叉树的代码
Jun 08 Javascript
js中变量的连续赋值(实例讲解)
Jul 08 Javascript
Vue中v-show添加表达式的问题(判断是否显示)
Mar 26 Javascript
解决vue v-for 遍历循环时key值报错的问题
Sep 06 Javascript
jquery图片预览插件实现方法详解
Jul 18 jQuery
vue实现鼠标移过出现下拉二级菜单功能
Dec 12 Javascript
JS array数组检测方式解析
May 19 Javascript
详解React路由传参方法汇总记录
Nov 29 Javascript
图解javascript作用域链
May 27 #Javascript
node.js命令行教程图文详解
May 27 #Javascript
详解JavaScript中的坐标和距离
May 27 #Javascript
优化Vue项目编译文件大小的方法步骤
May 27 #Javascript
了解JavaScript表单操作和表单域
May 27 #Javascript
分享一个vue项目“脚手架”项目的实现步骤
May 26 #Javascript
使用JS判断页面是首次被加载还是刷新
May 26 #Javascript
You might like
关于UEditor编辑器远程图片上传失败的解决办法
2012/08/31 PHP
PHP和Shell实现检查SAMBA与NFS Server是否存在
2015/01/07 PHP
php中stdClass的用法分析
2015/02/27 PHP
PHP多维数组元素操作类的方法
2016/11/14 PHP
详解thinkphp实现excel数据的导入导出(附完整案例)
2016/12/29 PHP
php实现生成带二维码图片并强制下载功能
2018/02/24 PHP
ThinkPHP框架获取最后一次执行SQL语句及变量调试简单操作示例
2018/06/13 PHP
Chrome Form多次提交表单问题的解决方法
2011/05/09 Javascript
前端开发过程中浏览器版本的两种判定方法
2013/10/30 Javascript
jquery获取URL中参数解决中文乱码问题的两种方法
2013/12/18 Javascript
node.js中的fs.futimes方法使用说明
2014/12/17 Javascript
js/jquery判断浏览器类型的方法小结
2015/05/12 Javascript
jquery.validate使用时遇到的问题
2015/05/25 Javascript
js验证框架实现代码分享
2016/05/18 Javascript
jQuery EasyUI Draggable拖动组件
2017/03/01 Javascript
详解webpack+angular2开发环境搭建
2017/06/28 Javascript
详解js静态资源文件请求的处理
2017/08/01 Javascript
Angular 开发学习之Angular CLI的安装使用
2017/12/31 Javascript
jQuery实现每隔一段时间自动更换样式的方法分析
2018/05/03 jQuery
vue-cli3.0 脚手架搭建项目的过程详解
2018/10/19 Javascript
小试SVG之新手小白入门教程
2019/01/08 Javascript
layui 上传插件 带预览 非自动上传功能的实例(非常实用)
2019/09/23 Javascript
Vue的v-model的几种修饰符.lazy,.number和.trim的用法说明
2020/08/05 Javascript
11个Javascript小技巧帮你提升代码质量(小结)
2020/12/28 Javascript
JS+CSS实现动态时钟
2021/02/19 Javascript
python中通过预先编译正则表达式提高效率
2017/09/25 Python
学习python中matplotlib绘图设置坐标轴刻度、文本
2018/02/07 Python
Selenium(Python web测试工具)基本用法详解
2018/08/10 Python
Pycharm+Scrapy安装并且初始化项目的方法
2019/01/15 Python
Python+Selenium+phantomjs实现网页模拟登录和截图功能(windows环境)
2019/12/11 Python
解决python使用list()时总是报错的问题
2020/05/05 Python
华硕新加坡官方网上商店:ASUS Singapore
2020/07/09 全球购物
公安局负责人查摆问题及整改方案
2014/09/27 职场文书
获奖感言范文
2015/07/31 职场文书
编写python程序的90条建议
2021/04/14 Python
Python数据可视化之用Matplotlib绘制常用图形
2021/06/03 Python