编写高性能Javascript
编写高性能Javascript
多年来,Javascript一直在web应用开发中占据重要的地位,但是很多开发者往往忽视一些性能方面的知识,特别是随着计算机硬件的不断升级,开发者越发觉得Javascript性能优化的好不好对网页的执行效率影响不明显。但在某些情况下,不优化的Javascript代码必然会影响用户的体验。因此,即使在当前硬件性能已经大大提升的时代,在编写Javascript代码时,若能遵循Javascript规范和注意一些性能方面的知识,对于提升代码的可维护性和优化性能将大有好处。
下面给出编写高性能的Javascript代码的若干建议:
1、尽量不要用for-in 循环去访问数组,建议用 for 循环进行循环:

1 function foo1() {
2 var i, b, c=[1,2,3];
3 for (i in c) {
4 b = c[i];
5 if(b === "2")
6 return b;
7 }
8 }
9 //性能更好
10 function foo2() {
11 var i, b, c=[1,2,3];
12 for (i=0;i<c.length;i++) {
13 b = c[i];
14 if(b === "2")
15 return b;
16 }
17
18 }

2、建议将对象进行缓存处理,特别是DOM访问是比较消耗资源的:

1 //c.length没有缓存,每次迭代都要计算一下数组的长度
2 function foo1() {
3 var i, b, c=[1,2,3];
4 for (i=0;i<c.length;i++) {
5 b = c[i];
6 if(b === "2")
7 return b;
8 }
9 }
10 //性能更好,第一次将数组的长度缓存到变量l中,第二次及后续的循环无需计算数组长度
11 function foo2() {
12 var i, b, c=[1,2,3],l;
13 for (i=0,l=c.length;i<l;i++) {
14 b = c[i];
15 if(b === "2")
16 return b;
17 }
18 }


1 //document.getElementById('info')没有缓存,每次都要遍历DOM
2 function foo1() {
3 var e;
4 document.getElementById('info').innerHTML="call 1";
5 document.getElementById('info').innerHTML="call 2";
6
7 }
8 //性能更好,第二次无需访问DOM
9 function foo2() {
10 var e=document.getElementById('info');
11 e.innerHTML="call 1";
12 e.innerHTML="call 2";
13 }

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、避免循环引用,防止内存泄漏:

1 //需要jQuery
2 function foo1(e,d) {
3 $(e).on("click", function() {
4 //对d进行逻辑处理
5 cbk(d);
6 }
7 });
8 }
9
10 //打破循环!
11 function foo2(e, d) {
12 $(e).on("click", cbk(d));
13 }
14 function cbk (d) {
15 //逻辑处理
16 }

5、建议避免在函数内返回一个未声明的变量,会污染外部变量:
1 function foo(a, b) {
2 r = a + b;
3 return r; //r未声明,则创建了一个全局变量
4 }
6、var声明变量,建议写在多行

1 //自己测试结果是foo1快,但也有一种观点是foo2快
2 function foo1() {
3 var c = 1;
4 var sum=0;
5 var d = 0;
6 var e;
7 }
8
9 function foo2() {
10 var c = 1,sum=0, d = 0, e;
11 }

说明:其实单个函数时间上差别较小,这里采用循环多次用累计时间进行性能对比,不同PC配置或者浏览器测试结果可能存在差异。
出处:http://www.cnblogs.com/isaboy/
编写高性能Javascript的更多相关文章
- 编写高性能Javascript代码的若干建议
多年来,Javascript一直在web应用开发中占据重要的地位,但是很多开发者往往忽视一些性能方面的知识,特别是随着计算机硬件的不断升级,开发者越发觉得Javascript性能优化的好不好对网页的执 ...
- 【JavaScript】【译】编写高性能JavaScript
英文链接:Writing Fast, Memory-Efficient JavaScript 很多JavaScript引擎,如Google的V8引擎(被Chrome和Node所用),是专门为需要快速执 ...
- 编写高性能JavaScript【转】
英文链接:Writing Fast, Memory-Efficient JavaScript 很多JavaScript引擎,如Google的V8引擎(被Chrome和Node所用),是专门为需要快速执 ...
- 《高性能javascript》 领悟随笔之-------DOM编程篇(二)
<高性能javascript> 领悟随笔之-------DOM编程篇二 序:在javaSctipt中,ECMASCRIPT规定了它的语法,BOM实现了页面与浏览器的交互,而DOM则承载着整 ...
- 《高性能javascript》 领悟随笔之-------DOM编程篇
<高性能javascript> 领悟随笔之-------DOM编程篇一 序:在javaSctipt中,ECMASCRIPT规定了它的语法,BOM实现了页面与浏览器的交互,而DOM则承载着整 ...
- 高性能JavaScript(您值得一看)
众所周知浏览器是使用单进程处理UI更新和JavaScript运行等多个任务的,而同一时间只能有一个任务被执行,如此说来,JavaScript运行了多长时间就意味着用户得等待浏览器响应需要花多久时间. ...
- 【读书笔记】读《高性能JavaScript》
这本<高性能JavaScript>讲述了有关JavaScript性能优化的方方面面,主要围绕以下几个方面: 1> 加载顺序 2> 数据访问(如怎样的数据类型访问最快,怎样的作用 ...
- 《高性能javascript》学习总结
本文是学习<高性能javascript>(Nichols C. Zakes著)的一些总结,虽然书比较过时,里面的知识点也有很多用不上了,但是毕竟是前人一步步探索过来的,记录着javascr ...
- 《高性能Javascript》 Summary(二)
第四章.算法和流程控制 Algorithms And Flow Control 原因:代码整体结构是执行速度的决定因素之一.代码量少不一定运行速度快,代码量多不一定运行速度慢.性能损失与组织代码和具体 ...
随机推荐
- Jquery中toggleClass的两种用法
css样式: <style type="text/css"> .bgc{ background-color:#F00; color: #FFF} </style& ...
- SDL2源码分析5:更新纹理(SDL_UpdateTexture())
===================================================== SDL源码分析系列文章列表: SDL2源码分析1:初始化(SDL_Init()) SDL2源 ...
- Coder的利器
Coder的利器记载 工作近三年,使用PC快六年,拥抱Mac整一年,投具器石榴裙三年.14年第一次被同事推荐Everything,开启了JeffJade对工具的折腾之旅,并乐此不疲.时去两年,这必然是 ...
- Why 使用TLS记录封装IP层VPN IS A Bad Idea
一个很自然的想法,使用TLS套餐一IP数据报实现第三层VPN.这种想法必须经过深思熟虑的,但不幸的是,.这是一个错误的想法.有文章<Why TCP Over TCP Is A Bad Idea& ...
- Red Gate系列之六 SQL Test 1.0.12.3 Edition SQL测试工具 完全破解+使用教程
原文:Red Gate系列之六 SQL Test 1.0.12.3 Edition SQL测试工具 完全破解+使用教程 Red Gate系列之六 SQL Test 1.0.12.3 Edition S ...
- WCF扩展之实现ZeroMQ绑定和protocolBuffer消息编码(一)概要设计
在我工作的项目中含有多种操作系统.多种设备.多种开发语言,因此需要使用跨平台的通信技术和自定义的消息编码.经过技术调研,ZeroMQ+ProtocolBuffer最终成为通信技术和编码方式.但是如 ...
- SharePoint 2010 BCS - 概要
博客地址 http://blog.csdn.net/foxdave SharePoint 2010首次引入了BCS的概念 - Business Connectivity Service.即业务连接服务 ...
- ALSA安装编程指南
ALSA全指南 一.什么是ALSA ALSA是Advanced Linux Sound Architecture,高级Linux声音架构的简称,它在Linux操作系统上提供了音频和MIDI(Mu ...
- FileUpload类别FileUpload1.FileName和FileUpload1.PostedFile.FileName差异
FileUpload1.FileName 用来获取client上使用 FileUpload 控件上载的文件的名称.此属性返回的文件名称不包括此文件在client上的路径. FileUpload1.Po ...
- rsync+inotify 实现资源服务器的同步目录下的文件变化时,备份服务器的同步目录更新,以资源服务器为准,去同步其他客户端
测试环境: 资源服务器(主服务器):192.168.200.95 备份服务器(客户端):192.168.200.89 同步目录:/etc/test 同步时使用的用户名hadoop密码12345 实验目 ...