实现高性能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 相关文章推荐
取得一定长度的内容,处理中文
Dec 20 Javascript
javascript 二维数组的实现与应用
Mar 16 Javascript
Javascript原型链和原型的一个误区
Oct 22 Javascript
JavaScript使用encodeURI()和decodeURI()获取字符串值的方法
Aug 04 Javascript
Highcharts使用简例及异步动态读取数据
Dec 30 Javascript
Bootstrap Navbar Component实现响应式导航
Oct 08 Javascript
详解VUE的状态控制与延时加载刷新
Mar 27 Javascript
微信小程序中使用ECharts 异步加载数据实现图表功能
Jul 13 Javascript
js+canvas实现验证码功能
Sep 21 Javascript
Vue CLI 3.x 自动部署项目至服务器的方法
Apr 02 Javascript
使用p5.js临摹动态图形
Oct 23 Javascript
JavaScript实现省市联动效果
Nov 22 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
PHP最常用的ini函数分析 针对PHP.ini配置文件
2010/04/22 PHP
php入门学习知识点六 PHP文件的读写操作代码
2011/07/14 PHP
php实现多维数组中每个单元值(数字)翻倍的方法
2015/02/16 PHP
使用PHP生成二维码的方法汇总
2015/07/22 PHP
PHP实现的解汉诺塔问题算法示例
2018/08/06 PHP
PHP实现图片压缩
2020/09/09 PHP
JS类中定义原型方法的两种实现的区别
2007/03/08 Javascript
js form 验证函数 当前比较流行的错误提示
2009/06/23 Javascript
关于js拖拽上传 [一个拖拽上传修改头像的流程]
2011/07/13 Javascript
jQuery+CSS实现菜单滑动伸展收缩(仿淘宝)
2013/03/22 Javascript
判断日期是否能跨月查询的js代码
2014/07/25 Javascript
JavaScript中的函数重载深入理解
2014/08/04 Javascript
Javascript实现字数统计
2015/07/03 Javascript
JS将unicode码转中文方法
2017/05/08 Javascript
vue实现微信分享朋友圈,发送朋友的示例讲解
2018/02/10 Javascript
js使用swiper实现层叠轮播效果实例代码
2018/12/12 Javascript
5分钟教你用nodeJS手写一个mock数据服务器的方法
2019/09/10 NodeJs
[01:31]完美与DOTA2历程
2014/07/31 DOTA
[55:23]VGJ.T vs Winstrike 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
Python3处理文件中每个词的方法
2015/05/22 Python
python 删除指定时间间隔之前的文件实例
2018/04/24 Python
wxPython实现文本框基础组件
2019/11/18 Python
python实时监控logstash日志代码
2020/04/27 Python
Django表单提交后实现获取相同name的不同value值
2020/05/14 Python
Python字符串三种格式化输出
2020/09/17 Python
HTML5中5个简单实用的API(第二篇,含全屏、可见性、拍照、预加载、电池状态)
2014/05/07 HTML / CSS
北美个性化礼品商店:Things Remembered
2018/06/12 全球购物
法国二手手袋、手表和奢侈珠宝购物网站:Collector Square
2018/07/05 全球购物
ShellScript面试题一则-ShellScript编程
2014/03/05 面试题
关于环保的建议书
2014/05/12 职场文书
民主生活会整改措施(党员)
2014/09/18 职场文书
四风问题个人自查剖析材料思想汇报
2014/09/21 职场文书
2016猴年春节问候语
2015/11/11 职场文书
先进基层党组织事迹材料2016
2016/02/29 职场文书
古诗文之爱国名句(77句)
2019/09/24 职场文书
python lambda 表达式形式分析
2022/04/03 Python