编写高性能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 相关文章推荐
Html中JS脚本执行顺序简单举例说明
Jun 19 Javascript
jquery Moblie入门—hello world的示例代码学习
Jan 08 Javascript
调试Javascript代码(浏览器F12及VS中debugger关键字)
Jan 25 Javascript
SWFUpload多文件上传及文件个数限制的方法
May 31 Javascript
模仿password输入框的实现代码
Jun 07 Javascript
js遮罩效果制作弹出注册界面效果
Jan 25 Javascript
JavaScript生成图形验证码
Aug 24 Javascript
jQuery+vue.js实现的九宫格拼图游戏完整实例【附源码下载】
Sep 12 jQuery
一个基于react的图片裁剪组件示例
Apr 18 Javascript
Vue数据双向绑定原理及简单实现方法
May 18 Javascript
javascript的hashCode函数实现代码小结
Aug 11 Javascript
vue 实现弹窗关闭后刷新效果
Apr 08 Vue.js
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
骨王战斗力在公会成员中排不进前五,却当选了会长,原因竟是这样
2020/03/02 日漫
PHP+JS无限级可伸缩菜单详解(简单易懂)
2007/01/02 PHP
PHP中基本符号及使用方法
2010/03/23 PHP
PHP Post获取不到非表单数据的问题解决办法
2018/02/27 PHP
PHP正则表达式笔记与实例详解
2019/05/09 PHP
php伪静态验证码不显示的解决方案
2019/09/26 PHP
laravel在中间件内生成参数并且传递到控制器中的2种姿势
2019/10/15 PHP
IE6/7 and IE8/9/10(IE7模式)依次隐藏具有absolute或relative的父元素和子元素后再显示父元素
2011/07/31 Javascript
js判断undefined变量类型使用typeof
2013/06/03 Javascript
通过javascript获取iframe里的值示例代码
2013/06/24 Javascript
JS 打印界面的CSS居中代码适用所有浏览器
2014/03/19 Javascript
javascript动态设置样式style实例分析
2015/05/13 Javascript
node.js使用cluster实现多进程
2016/03/17 Javascript
jQuery插件编写步骤详解
2016/06/03 Javascript
微信小程序 sha1 实现密码加密实例详解
2017/07/06 Javascript
详解a++和++a的区别
2017/08/30 Javascript
原生JS+HTML5实现的可调节写字板功能示例
2018/08/30 Javascript
jQuery插件实现的日历功能示例【附源码下载】
2018/09/07 jQuery
jQuery.parseJSON()函数详解
2019/02/28 jQuery
ES6 Promise对象的含义和基本用法分析
2019/06/14 Javascript
JavaScript实现英语单词题库
2019/12/24 Javascript
jQuery实现的解析本地 XML 文档操作示例
2020/04/30 jQuery
Vue 如何使用props、emit实现自定义双向绑定的实现
2020/06/05 Javascript
解决vue addRoutes不生效问题
2020/08/04 Javascript
[08:40]Navi Vs Newbee
2018/06/07 DOTA
Python isinstance判断对象类型
2008/09/06 Python
python实现多线程行情抓取工具的方法
2018/02/28 Python
儿童学习python的一些小技巧
2018/05/27 Python
新年快乐! python实现绚烂的烟花绽放效果
2019/01/30 Python
PyQt5基本控件使用详解:单选按钮、复选框、下拉框
2019/08/05 Python
三下乡活动方案
2014/01/31 职场文书
优秀工会工作者事迹材料
2014/06/02 职场文书
科学发展观活动总结
2014/08/28 职场文书
简历自荐信范文
2015/03/09 职场文书
小学生节水倡议书
2015/04/29 职场文书
党员读书活动心得体会
2016/01/14 职场文书