编写高性能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插件处理mouseover时内部有子元素时发生样式闪烁
Dec 08 Javascript
JavaScript 模式之工厂模式(Factory)应用介绍
Nov 15 Javascript
JQuery中使用Ajax赋值给全局变量异常的解决方法
Jan 10 Javascript
node.js中watch机制详解
Nov 17 Javascript
JavaScript学习笔记之JS对象
Jan 22 Javascript
JQuery中extend的用法实例分析
Feb 08 Javascript
JavaScript中Cookies的相关使用教程
Jun 04 Javascript
jquery实现最简单的滑动菜单效果代码
Sep 12 Javascript
微信小程序实战之轮播图(3)
Apr 17 Javascript
利用JavaScript的%做隔行换色的实例
Nov 25 Javascript
vue 每次渲染完页面后div的滚动条保持在最底部的方法
Mar 17 Javascript
react配合antd组件实现的管理系统示例代码
Apr 24 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下载CSS文件中的图片的代码
2013/09/24 PHP
php session实现多级目录存放实现代码
2016/02/03 PHP
PHP生成短网址方法汇总
2016/07/12 PHP
CI(CodeIgniter)框架视图中加载视图的方法
2017/03/24 PHP
PHP高并发和大流量解决方案整理
2021/03/09 PHP
Javascript学习笔记2 函数
2010/01/11 Javascript
IE6浏览器下resize事件被执行了多次解决方法
2012/12/11 Javascript
javascript图像处理—仿射变换深度理解
2013/01/16 Javascript
JavaScript字符串对象slice方法入门实例(用于字符串截取)
2014/10/16 Javascript
JQuery报错Uncaught TypeError: Illegal invocation的处理方法
2015/03/13 Javascript
javascript实现根据iphone屏幕方向调用不同样式表的方法
2015/07/13 Javascript
WordPress 单页面上一页下一页的实现方法【附代码】
2016/03/10 Javascript
AngularJS入门教程之模块化操作用法示例
2016/11/02 Javascript
详解RequireJS按需加载样式文件
2017/04/12 Javascript
jQuery中hover方法搭配css的hover选择器,实现选中元素突出显示方法
2017/05/08 jQuery
NodeJS实现图片上传代码(Express)
2017/06/30 NodeJs
基于JavaScript实现前端数据多条件筛选功能
2020/08/19 Javascript
浅谈VUE监听窗口变化事件的问题
2018/02/24 Javascript
vue中父子组件注意事项,传值及slot应用技巧
2018/05/09 Javascript
新手如何快速理解js异步编程
2019/06/24 Javascript
VScode格式化ESlint方法(最全最好用方法)
2019/09/10 Javascript
JS XMLHttpRequest原理与使用方法深入详解
2020/04/30 Javascript
vue 解决无法对未定义的值,空值或基元值设置反应属性报错问题
2020/07/31 Javascript
node.js爬虫框架node-crawler初体验
2020/10/29 Javascript
使用python提取html文件中的特定数据的实现代码
2013/03/24 Python
Python实现多线程下载文件的代码实例
2014/06/01 Python
在Python中使用PIL模块处理图像的教程
2015/04/29 Python
使用Python实现在Windows下安装Django
2018/10/17 Python
python代码 输入数字使其反向输出的方法
2018/12/22 Python
Python中使用gflags实例及原理解析
2019/12/13 Python
解决安装pyqt5之后无法打开spyder的问题
2019/12/13 Python
使用TensorFlow直接获取处理MNIST数据方式
2020/02/10 Python
Django ModelForm组件原理及用法详解
2020/10/12 Python
2014年元旦感言
2014/03/06 职场文书
2014离婚协议书范文两篇
2014/09/15 职场文书
Java工作中实用的代码优化技巧分享
2022/04/21 Java/Android