编写高性能Javascript代码的N条建议


Posted in Javascript onOctober 12, 2015

多年来,Javascript一直在web应用开发中占据重要的地位,但是很多开发者往往忽视一些性能方面的知识,特别是随着计算机硬件的不断升级,开发者越发觉得Javascript性能优化的好不好对网页的执行效率影响不明显。但在某些情况下,不优化的Javascript代码必然会影响用户的体验。因此,即使在当前硬件性能已经大大提升的时代,在编写Javascript代码时,若能遵循Javascript规范和注意一些性能方面的知识,对于提升代码的可维护性和优化性能将大有好处。

  下面给出编写高性能的Javascript代码的若干建议:

  1、尽量不要用for-in 循环去访问数组,建议用 for 循环进行循环:       

function foo() {
   var i, b, c=[,,];
   for (i in c) {
    b = c[i];
    if(b === "")
     return b;
   }
  }
  //性能更好
  function foo() {
   var i, b, c=[,,];
   for (i=;i<c.length;i++) {
    b = c[i];
    if(b === "")
     return b;
   }
  }

  2、建议将对象进行缓存处理,特别是DOM访问是比较消耗资源的:

//c.length没有缓存,每次迭代都要计算一下数组的长度
  function foo() {
   var i, b, c=[,,];
   for (i=;i<c.length;i++) {
    b = c[i];
    if(b === "")
     return b;
   }
  }
  //性能更好,第一次将数组的长度缓存到变量l中,第二次及后续的循环无需计算数组长度
  function foo() {
   var i, b, c=[,,],l;
   for (i=,l=c.length;i<l;i++) {
    b = c[i];
    if(b === "")
     return b;
   }
  }

  //document.getElementById('info')没有缓存,每次都要遍历DOM
  function foo() {
   var e;
   document.getElementById('info').innerHTML="call ";
   document.getElementById('info').innerHTML="call ";
   
  }
  //性能更好,第二次无需访问DOM
  function foo() {
  var e=document.getElementById('info');
  e.innerHTML="call ";
   e.innerHTML="call ";
  }

3、建议不要在函数内进行过深的嵌套判断: 

//函数内嵌套判断语句过多
  function foo1() {
   var r={};
   r.data={};
   r.data.myProp=2;
   if (r) {
   if (r.data) {
    if (r.data.myProp) {
     //逻辑处理
    } 
    else {
     //逻辑处理
    }
   }
 }
 }
  //性能更好
 function foo2() {
   var r={};
   r.data={};
   r.data.myProp=2;
  if (!r) return;
  if (!r.data) return;  
  if (r.data.myProp) {
   //逻辑处理
  } else {
    //逻辑处理
  }
 }

  4、避免循环引用,防止内存泄漏:

//需要jQuery
 function foo(e,d) {
  $(e).on("click", function() {
    //对d进行逻辑处理
    cbk(d);
      } 
  });
 }
 //打破循环!
 function foo(e, d) {
  $(e).on("click", cbk(d));
 }
 function cbk (d) {
 //逻辑处理
 }

5、建议避免在函数内返回一个未声明的变量,会污染外部变量:

function foo(a, b) {
  r = a + b;
  return r; //r未声明,则创建了一个全局变量
 }

6、var声明变量,建议写在多行

//自己测试结果是foo快,但也有一种观点是foo快
 function foo() {
  var c = ;
  var sum=;
  var d = ;
  var e;
 }
 function foo() {
  var c = ,sum=, d = , e;
 }

说明:其实单个函数时间上差别较小,这里采用循环多次用累计时间进行性能对比,不同PC配置或者浏览器测试结果可能存在差异。

以上内容是编写高性能Javascript代码的N条建议,希望对大家有所帮助。

Javascript 相关文章推荐
修改jQuery Validation里默认的验证方法
Feb 14 Javascript
JQuery文本改变触发事件如聚焦事件、失焦事件
Jan 15 Javascript
extjs 时间范围选择自动判断的实现代码
Jun 24 Javascript
详解AngularJS的通信机制
Jun 18 Javascript
JavaScript正则表达式的分组匹配详解
Feb 13 Javascript
Bootstrap零基础入门教程(三)
Jul 18 Javascript
详解AngularJS2 Http服务
Jun 26 Javascript
使用Bootstrap + Vue.js实现表格的动态展示、新增和删除功能
Nov 27 Javascript
js根据json数据中的某一个属性来给数据分组的方法
Oct 08 Javascript
js实现掷骰子小游戏
Oct 24 Javascript
js实现超级玛丽小游戏
Mar 18 Javascript
JS指定音频audio在某个时间点进行播放
Nov 28 Javascript
JavaScript 性能优化小结
Oct 12 #Javascript
一个php+js实时显示时间问题
Oct 12 #Javascript
JS实现新浪微博效果带遮罩层的弹出框代码
Oct 12 #Javascript
jquery实现仿新浪微博带动画效果弹出层代码(可关闭、可拖动)
Oct 12 #Javascript
关于事件mouseover ,mouseout ,mouseenter,mouseleave的区别
Oct 12 #Javascript
jquery实现可自动判断位置的弹出层效果代码
Oct 12 #Javascript
jQuery实现鼠标经过时出现隐藏层文字链接的方法
Oct 12 #Javascript
You might like
php urlencode()与urldecode()函数字符编码原理详解
2011/12/06 PHP
用php代码限制国内IP访问我们网站
2015/09/26 PHP
Zend Framework教程之Autoloading用法详解
2016/03/08 PHP
用一段js程序来实现动画功能
2007/03/06 Javascript
Ajax,UTF-8还是GB2312 eval 还是execScript
2008/11/13 Javascript
ASP.NET jQuery 实例4(复制TextBox的文本到本地剪贴板上)
2012/01/13 Javascript
javascript时间排序算法实现活动秒杀倒计时效果
2021/01/28 Javascript
layer实现关闭弹出层刷新父界面功能详解
2017/11/15 Javascript
VueJs使用Amaze ui调整列表和内容页面
2017/11/30 Javascript
js中let和var定义变量的区别
2018/02/08 Javascript
Angular使用操作事件指令ng-click传多个参数示例
2018/03/27 Javascript
node 使用 async 控制并发的方法
2018/05/07 Javascript
微信小程序页面传多个参数跳转页面的实现方法
2019/05/17 Javascript
vue实现前端列表多条件筛选
2020/10/26 Javascript
Python时间戳与时间字符串互相转换实例代码
2013/11/28 Python
Python中的Descriptor描述符学习教程
2016/06/02 Python
对比Python中__getattr__和 __getattribute__获取属性的用法
2016/06/21 Python
Python信息抽取之乱码解决办法
2017/06/29 Python
selenium设置proxy、headers的方法(phantomjs、Chrome、Firefox)
2018/11/29 Python
python判断字符串或者集合是否为空的实例
2019/01/23 Python
如何通过python画loss曲线的方法
2019/06/26 Python
Python并发请求下限制QPS(每秒查询率)的实现代码
2020/06/05 Python
使用Keras画神经网络准确性图教程
2020/06/15 Python
Python类成员继承重写的实现
2020/09/16 Python
Staples加拿大官方网站:办公用品一站式采购
2016/09/25 全球购物
Allsole美国/加拿大:英国一家专门出售品牌鞋子的网站
2018/10/21 全球购物
印尼在线购买隐形眼镜网站:Lensza.co.id
2019/04/27 全球购物
事业单位辞职信范文
2014/01/19 职场文书
中专生自我鉴定范文
2014/02/02 职场文书
护理学应聘自荐书范文
2014/02/05 职场文书
乡镇干部十八大感言
2014/02/17 职场文书
法律系毕业生自荐信范文
2014/03/27 职场文书
管理建议书范文
2014/05/13 职场文书
2014年十一国庆节爱国演讲稿
2014/09/23 职场文书
横店影视城导游词
2015/02/06 职场文书
Python 中的 copy()和deepcopy()
2021/11/07 Python