编写高性能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 相关文章推荐
23个超流行的jQuery相册插件整理分享
Apr 25 Javascript
jquery数组之存放checkbox全选值示例代码
Dec 20 Javascript
table对象中的insertRow与deleteRow使用示例
Jan 26 Javascript
js控制元素显示在屏幕固定位置及监听屏幕高度变化的方法
Aug 11 Javascript
JavaScript弹出对话框的三种方式
Mar 23 Javascript
将json转换成struts参数的方法
Nov 08 Javascript
详解基于Koa2开发微信二维码扫码支付相关流程
May 16 Javascript
vue中使用input[type=&quot;file&quot;]实现文件上传功能
Sep 10 Javascript
简单易扩展可控性强的Jquery转盘抽奖程序
Mar 16 jQuery
关于layui表单中按钮自动提交的解决方法
Sep 09 Javascript
在vue+element ui框架里实现lodash的debounce防抖
Nov 13 Javascript
prettier自动格式化去换行的实现代码
Aug 25 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+dojo 的数据库保存拖动布局的一个方法dojo 这里下载
2007/03/07 PHP
Stop SQL Server
2007/06/21 Javascript
用JavaScript调用WebService的示例
2008/04/07 Javascript
js 模拟实现类似c#下的hashtable的简单功能代码
2010/01/24 Javascript
javascript实现可改变滚动方向的无缝滚动实例
2013/06/17 Javascript
js实现点击链接后延迟3秒再跳转的方法
2015/06/05 Javascript
jQuery实现的网页左侧在线客服效果代码
2015/10/23 Javascript
JQuery datepicker 用法详解
2015/12/25 Javascript
canvas快速绘制圆形、三角形、矩形、多边形方法介绍
2016/12/29 Javascript
使用AngularJS 跨站请求如何解决jsonp请求问题
2017/01/16 Javascript
Vue.js实现简单动态数据处理
2017/02/13 Javascript
React-intl 实现多语言的示例代码
2017/11/03 Javascript
npm的lock机制解析
2019/06/20 Javascript
vue项目中使用AES实现密码加密解密(ECB和CBC两种模式)
2019/08/12 Javascript
解决layer弹出层msg的文字不显示的问题
2019/09/11 Javascript
python使用正则表达式检测密码强度源码分享
2014/06/11 Python
Python实现命令行通讯录实例教程
2016/08/18 Python
Django Web开发中django-debug-toolbar的配置以及使用
2018/05/06 Python
Python range、enumerate和zip函数用法详解
2019/09/11 Python
Python随机数函数代码实例解析
2020/02/09 Python
python字典和json.dumps()的遇到的坑分析
2020/03/11 Python
Python模拟伯努利试验和二项分布代码实例
2020/05/27 Python
树莓派升级python的具体步骤
2020/07/05 Python
美国宠物美容和宠物用品购物网站:Cherrybrook
2018/12/07 全球购物
工厂门卫岗位职责
2013/11/25 职场文书
财务工作者先进事迹材料
2014/01/17 职场文书
女子职高个人自荐书
2014/02/01 职场文书
运动会入场式解说词
2014/02/18 职场文书
大学校务公开实施方案
2014/03/31 职场文书
党员教师个人对照检查材料(群众路线)
2014/09/26 职场文书
致青春观后感
2015/06/09 职场文书
JS ES6异步解决方案
2021/04/29 Javascript
DjangoRestFramework 使用 simpleJWT 登陆认证完整记录
2021/06/22 Python
Win11怎么把合并的任务栏分开 Win11任务栏合并分开教程
2022/04/06 数码科技
Zabbix对Kafka topic积压数据监控的解决方案
2022/07/07 Servers
JS class语法糖的深入剖析
2022/07/07 Javascript