编写高性能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 相关文章推荐
腾讯的ip接口 方便获取当前用户的ip地理位置
Nov 25 Javascript
JS不间断向上滚动效果代码
Dec 25 Javascript
让alert不出现弹窗的两种方法
May 18 Javascript
JS中的THIS和WINDOW.EVENT.SRCELEMENT详解
May 25 Javascript
js实现的简单图片浮动效果完整实例
May 10 Javascript
AngularJs解决跨域问题案例详解(简单方法)
May 19 Javascript
js获取隐藏元素宽高的实现方法
May 19 Javascript
url中的特殊符号有什么含义(推荐)
Jun 17 Javascript
微信小程序开发一键登录 获取session_key和openid实例
Nov 23 Javascript
vue.js中过滤器的使用教程
Jun 08 Javascript
在Chrome DevTools中调试JavaScript的实现
Apr 07 Javascript
javascript全局自定义鼠标右键菜单
Dec 08 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
PHP4实际应用经验篇(1)
2006/10/09 PHP
php iconv() : Detected an illegal character in input string
2010/12/05 PHP
file_get_contents获取不到网页内容的解决方法
2013/03/07 PHP
php定时计划任务的实现方法详解
2013/06/06 PHP
PHP结合JQueryJcrop实现图片裁切实例详解
2014/07/24 PHP
php绘图之在图片上写中文和英文的方法
2015/01/24 PHP
在Linux系统的服务器上隐藏PHP版本号的方法
2015/06/06 PHP
PHPStrom中实用的功能和快捷键大全
2015/09/23 PHP
Javascript 调试利器 Firebug使用详解六
2009/07/05 Javascript
javascript instanceof 内部机制探析
2010/10/15 Javascript
js中indexof的用法详细解析
2013/12/24 Javascript
让input框实现类似百度的搜索提示(基于jquery事件监听)
2014/01/31 Javascript
HTML5+setCutomValidity()函数验证表单实例分享
2015/04/24 Javascript
JavaScript中函数声明与函数表达式的区别详解
2016/08/18 Javascript
Node.js开启Https的实践详解
2016/10/25 Javascript
js获取当前周、上一周、下一周日期
2017/03/19 Javascript
JS简单实现自定义右键菜单实例
2017/05/31 Javascript
JS实现访问DOM对象指定节点的方法示例
2018/04/04 Javascript
angularjs1.5 组件内用函数向外传值的实例
2018/09/30 Javascript
在vue-cli 3中给stylus、sass样式传入共享的全局变量
2019/08/12 Javascript
Vue发布订阅模式实现过程图解
2020/04/30 Javascript
python使用wxpython开发简单记事本的方法
2015/05/20 Python
为什么选择python编程语言入门黑客攻防 给你几个理由!
2018/02/02 Python
Python GUI编程学习笔记之tkinter事件绑定操作详解
2020/03/30 Python
python使用多线程查询数据库的实现示例
2020/08/17 Python
Python命令行参数定义及需要注意的地方
2020/11/30 Python
CSS3实现苹果手机解锁的字体闪亮效果示例
2021/01/05 HTML / CSS
澳大利亚运动鞋零售商:The Athlete’s Foot
2018/11/04 全球购物
《小壁虎借尾巴》教学反思
2014/02/16 职场文书
感恩老师的演讲稿
2014/05/06 职场文书
酒店节能降耗方案
2014/05/08 职场文书
团结就是力量演讲稿
2014/05/21 职场文书
暑期社会实践先进个人主要事迹
2014/05/22 职场文书
企业财务人员岗位职责
2015/04/14 职场文书
入党积极分子培养联系人意见
2015/08/12 职场文书
教你使用Jenkins集成Harbor自动发布镜像
2022/04/03 Servers