编写高性能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 相关文章推荐
让getElementsByName适应IE和firefox的方法
Sep 24 Javascript
JQuery 选择器 xpath 语法应用
May 13 Javascript
javascript的原生方法获取数组中的最大(最小)值
Dec 19 Javascript
node.js中的fs.fchmodSync方法使用说明
Dec 16 Javascript
微信小程序 倒计时组件实现代码
Oct 24 Javascript
jquery做个日期选择适用于手机端示例
Jan 10 Javascript
80%应聘者都不及格的JS面试题
Mar 21 Javascript
js自定义Tab选项卡效果
Jun 05 Javascript
关于vue单文件中引用路径的处理方法
Jan 08 Javascript
bootstrap 点击空白处popover弹出框隐藏实例
Jan 24 Javascript
原生JS实现瀑布流插件
Feb 06 Javascript
从零开始搭建webpack+react开发环境的详细步骤
May 18 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 mcrypt可逆加密算法分析
2011/07/19 PHP
PHP彩蛋信息介绍和阻止泄漏的方法(隐藏功能)
2014/08/06 PHP
PHP预定义变量9大超全局数组用法详解
2016/04/23 PHP
理清PHP在Linxu下执行时的文件权限方法
2017/06/07 PHP
PHP parse_ini_file函数的应用与扩展操作示例
2019/01/07 PHP
window.print打印指定div指定网页指定区域的方法
2014/08/04 Javascript
js创建表单元素并使用submit进行提交
2014/08/14 Javascript
jQuery菜单插件用法实例
2015/07/25 Javascript
jquery实现下拉框功能效果【实例代码】
2016/05/06 Javascript
基于bootstrap插件实现autocomplete自动完成表单
2016/05/07 Javascript
json格式的javascript对象用法分析
2016/07/04 Javascript
Node.js中sequelize时区的配置方法
2017/12/10 Javascript
Node.js实现注册邮箱激活功能的方法示例
2018/03/23 Javascript
react+redux仿微信聊天界面
2019/06/21 Javascript
vue3.0中友好使用antdv示例详解
2021/01/05 Vue.js
Python2.x版本中cmp()方法的使用教程
2015/05/14 Python
机器学习10大经典算法详解
2017/12/07 Python
Python爬虫爬取一个网页上的图片地址实例代码
2018/01/16 Python
python实现祝福弹窗效果
2019/04/07 Python
20行python代码的入门级小游戏的详解
2019/05/05 Python
Python如何输出百分比
2020/07/31 Python
python 调用Google翻译接口的方法
2020/12/09 Python
手工制作的音乐盒:Music Box Attic
2019/09/05 全球购物
Hotels.com韩国:海外国内旅行所需的酒店和住宿预订网站
2020/05/08 全球购物
Athleta官网:购买女士瑜伽服、技术运动服和休闲运动服
2020/11/12 全球购物
怎样在 Applet 中建立自己的菜单(MenuBar/Menu)?
2012/06/20 面试题
GC是什么?为什么要有GC?
2013/12/08 面试题
小学英语课后反思
2014/04/26 职场文书
关于护士节的演讲稿
2014/05/26 职场文书
2014年教师节演讲稿
2014/09/03 职场文书
离婚起诉书范本
2015/05/18 职场文书
三八红旗手先进事迹材料(2016推荐版)
2016/02/25 职场文书
Apache Calcite 实现方言转换的代码
2021/04/24 Servers
Golang 使用Map实现去重与set的功能操作
2021/04/29 Golang
详解Python中的进程和线程
2021/06/23 Python
Django模型层实现多表关系创建和多表操作
2021/07/21 Python