js性能优化小结

避免全局查找

浏览器访问局部变量的速度要比访问全局变量的速度更快,变量在作用域链中一层一层查找需要消耗时间。

 1   // 不推荐
 2   function fn(){
 3     document.getElementById(‘id1‘);
 4     document.getElementById(‘id2‘);
 5   }
 6
 7   // 推荐
 8   function fn(){
 9     var doc = document;
10     doc.getElementById(‘id1‘);
11     doc.getElementById(‘id2‘);
12   }
13   // 推荐
14   !function fn(doc){
15     doc.getElementById(‘id1‘);
16     doc.getElementById(‘id2‘);
17   }(document);

类似eval的问题

js中的eval、setTimeout、setInterval、new Function()操作都能将字符串当作js代码来执行,在此过程中代码执行效率非常底下,应当避免使用。推荐使用匿名函数或传递函数引用。

 1   // 不推荐使用eval
 2
 3   // setTimeout、setInterval、new Function建议直接传入匿名函数或函数引用
 4   setTimeout(‘alert(1)‘, 1000); // 不推荐
 5   setInterval(‘alert(1)‘, 1000); // 不推荐
 6   var oFn = new Function(‘alert(1)‘); // 不推荐
 7
 8   // 推荐
 9   setTimeout(function(){
10     alert(1);
11   }, 1000);
12   setTimeout(fn, 1000);
13
14   setInterval(function(){
15     alert(1);
16   }, 1000);
17   //setInterval(fn, 1000);
18
19   var oFn = new Function(function(){
20     alert(1);
21   });
22   var oFn = new Function(fn);
23
24   function fn(){
25     alert(1);
26   }

定时器

当不断间隔一段时间运行代码时,应当使用setInterval,而不要通过setTimeout来实现,因为开启一个定时器都会初始化一次,采用setTimeout是通过不断初始化定时器来实现的。

 1   var i = 0,
 2     timer = null;
 3
 4   // 不推荐
 5   function fnTimeout(){
 6     if(i < 10){
 7       setTimeout(fnTimeout, 1000); // 不断初始化
 8     }
 9     console.log(i++);
10   }
11   fnTimeout();
12
13   // 推荐
14   function fnInterval(){
15     if(i >= 10){
16       clearInterval(timer);
17       timer = null;
18     }
19     console.log(i++);
20   }
21   setInterval(fnInterval, 1000); // 初始化一次

多个字符串连接

如果需要将多个字符串连接起来,要少使用+=,最好使用数据的jolin方法。

 1   var a = ‘a‘,
 2     b = ‘b‘,
 3     c = ‘c‘,
 4     s = ‘‘,
 5     arr = [];
 6
 7   // 不推荐
 8   s += a;
 9   s += b;
10   s += c;
11
12   // 推荐
13   s = a + b + c;
14
15   // 最佳
16   arr.push(a);
17   arr.push(b);
18   arr.push(c);
19   s = arr.join(‘‘);

类型转换

将数字转换为字符串使用"" + 数字 ;

字符串转数字:1*字符串;

任何内型转布尔:!!变量;

变量声明使用单var

变量声明都采用单var形式,可以减少代码执行时间,变量声明比较统一。

 1   // 不推荐
 2   var a = ‘a‘;
 3   var b = ‘b‘;
 4   var c = ‘c‘;
 5   var s = ‘‘;
 6   var arr = [];
 7
 8   // 推荐
 9   var a = ‘a‘,
10     b = ‘b‘,
11     c = ‘c‘,
12     s = ‘‘,
13     arr = [];

自增自减放入表达式中

1   // 不推荐
2   var i = 0,
3     b = i;
4   i++;
5
6   // 推荐
7   var i = 0,
8     b = i++;

使用对象和数组字面量

1   // 不推荐
2   var arr = new Array,
3     obj = new Object,
4     re = new RegExp(‘a‘);
5
6   // 推荐
7   var arr = [],
8     obj = {},
9     re = /a/;

闭包中不再使用的变量的释放

闭包中的变量如果有其他函数使用了,那么该变量一直会留在内存中,另外DOM的引用会消耗很大的内存,因此应该及时释放闭包中不再引用的变量。

 1   // 不推荐
 2   var fn = !function(doc){
 3     var obj = {name: ‘hum‘},
 4       arr = [1, 2],
 5       oDom = doc.getElementById(‘id‘);
 6
 7     // ......
 8
 9     return function(){
10       console.log(obj.name);
11     }
12   }(document);
13
14   // 推荐
15   var fn = !function(doc){
16     var obj = {name: ‘hum‘},
17       arr = [1, 2],
18       oDom = doc.getElementById(‘id‘);
19
20     // ......
21
22     arr = doc = oDom = null; // 释放
23
24     return function(){
25       console.log(obj.name);
26     }
27   }(document);

减少reflow

在css规范中有一个渲染对象的概念,通常用盒子来表示。mozilla通过一个叫frame的对象来操作盒子。

reflow:加载DOM树、创建或更新frame结构的响应 的过程。减少reflow的方法:

1、将元素删除,完成修改后还原

2、将元素display等于none,完成修改后还原

3、修改多个样式时用类代替对此style操作

4、添加大量元素到页面使用documentFragment

事件委托

将子元素的事件都注册到父元素或更高的元素上,不用为每个子节点注册事件监听。

DOM删除

删除DOM节点时,一定要删除DOM上绑定的事件,否则无法回收,占用内存。

减少DOM集合的访问

通过js获取集合的情况:

1、getElementsByTagName

2、childNodes

3、attributes

4、document.forms  document.images

...

缩短否定操作

尽量使用逻辑非来进行条件判断,而减少使用等于null或等于false

时间: 2024-08-02 10:19:09

js性能优化小结的相关文章

JS性能优化

下面是一些关于客户端JS性能的一些优化的小技巧: 1.[顶]关于JS的循环,循环是一种常用的流程控制.JS提供了三种循环:for(;;).while().for(in).在这三种循环中 for(in)的效率最差,因为它需要查询Hash键,因此应尽量少用for(in)循环,for(;;).while()循环的性能基本持平.当然,推 荐使用for循环,如果循环变量递增或递减,不要单独对循环变量赋值,而应该使用嵌套的++或--运算符. 2.如果需要遍历数组,应该先缓存数组长度,将数组长度放入局部变量中

iOS性能优化小结

iOS性能优化分析 首先要熟悉几个概念 PNG 和 JPG 的区别是什么? png格式的图片有alpha通道,jpeg则没有.png无损压缩,jpeg允许你选择0-100%的压缩质量.如果需要alpha通道(透明),就只能用png格式. CPU 和 GPU 如果想看看两者的区别,先得了解iOS视图背后的层级结构原理  上图中的最底下一行是硬件层,由GPU和CPU组成. 我们经常说到的硬件加速其实是指OpenGL,Core Animation/UIKit基于GPU之上对计算机图形合成以及绘制的实现

js 性能优化 篇一

JS性能优化 摘自:http://www.china125.com/design/js/3631.htm 首先,由于JS是一种解释型语言,执行速度要比编译型语言慢得多.(注:,Chrome是第一款内置优化引擎,将JS编译成本地代码的浏览器,其它浏览器也陆续实现了JS的编译过程.但是,即使到了编译执行JS的新阶段,仍然会存在低效率的代码.)以下总结一些可以改进代码的整体性能的方法. 1.注意作用域 记住一点,随着作用域中的作用域数量的增加,访问当前作用域以外的变量的时间也在增加.所以,访问全局变量

js性能优化-事件委托(2)

<!DOCTYPE HTML><html><head> <meta charset="utf-8" /> <title>js性能优化</title> <script type="text/javascript" src="script/jquery.js"></script></head><body><ul id='lis

js性能优化-事件委托

js性能优化-事件委托 考虑一个列表,在li的数量非常少的时候,为每一个li添加事件侦听当然不会存在太多性能方面的问题,但是当列表非常的长,长到上百上千甚至上万的时候(当然只是一个解释,实际工作中很少遇到这么多li的情况),为每个li添加事件侦听就会对页面性能产生很大的影响. 就像下面这段代码: <!DOCTYPE HTML><html><head><meta charset="utf-8" /><title>js性能优化&l

js性能优化文章集锦

总结的js性能优化方面的小知识http://www.it165.net/pro/html/201503/35336.html 如何优化你的JS代码http://www.php100.com/html/webkaifa/javascript/2012/0619/10568.html 我所经历的JS性能优化http://www.cnblogs.com/koking/archive/2011/10/17/2215665.html DOM性能瓶颈与Javascript性能优化http://www.cnb

stb前端开发js性能优化总结

js性能优化 javascript是一种解释型语言,性能无法达到和C.C++等编译语言的水平,但还是有一些方法来改进. 1.循环 JavaScript中的循环方式有for(;;).while().for(in)3种.其中for(in)的效率极差,因为for(in)执行过程中需要查询散列键.for(;;)和while()比较,while循环的效率要优于for(;;). 2.局部变量和全局变量 局部变量的访问速度更快,因为全局变量其实是全局对象的成员,而局部变量是放在函数的堆栈当中的. 3.不使用e

你不知道的Node.js性能优化,读了之后水平直线上升

本文由云+社区发表 "当我第一次知道要这篇文章的时候,其实我是拒绝的,因为我觉得,你不能叫我写马上就写,我要有干货才行,写一些老生常谈的然后加上好多特技,那个 Node.js 性能啊好像 Duang~ 的一下就上去了,那读者一定会骂我,Node.js 根本没有这样搞性能优化的,都是假的." ------ 斯塔克·成龙·王 1.使用最新版本的 Node.js 仅仅是简单的升级 Node.js 版本就可以轻松地获得性能提升,因为几乎任何新版本的 Node.js 都会比老版本性能更好,为什么

css写作建议和性能优化小结

1.前言 还有几天就到国庆中秋了,快要放假了,先祝大家节日快乐!之前写过js的写作建议和技巧,那么今天就来聊聊css吧!说到css,每一个网页都离不开css,但是对于css,很多开发者的想法就是,css只要能用来布局,把效果图排出来就可以了,其它的细节或者优化,不需要怎么考虑.但是我觉得css可不只是把页面的布局完成就是完事的,还需要考虑很多细节有优化,更不会像大家想得那么简单,在学习当中,如果发现什么技巧或者优化的点,我也会学以致用!那么今天,就分享下我总结的css写作建议和性能优化的一些问题