编写高性能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的更多相关文章

  1. 编写高性能Javascript代码的若干建议

    多年来,Javascript一直在web应用开发中占据重要的地位,但是很多开发者往往忽视一些性能方面的知识,特别是随着计算机硬件的不断升级,开发者越发觉得Javascript性能优化的好不好对网页的执 ...

  2. 【JavaScript】【译】编写高性能JavaScript

    英文链接:Writing Fast, Memory-Efficient JavaScript 很多JavaScript引擎,如Google的V8引擎(被Chrome和Node所用),是专门为需要快速执 ...

  3. 编写高性能JavaScript【转】

    英文链接:Writing Fast, Memory-Efficient JavaScript 很多JavaScript引擎,如Google的V8引擎(被Chrome和Node所用),是专门为需要快速执 ...

  4. 《高性能javascript》 领悟随笔之-------DOM编程篇(二)

    <高性能javascript> 领悟随笔之-------DOM编程篇二 序:在javaSctipt中,ECMASCRIPT规定了它的语法,BOM实现了页面与浏览器的交互,而DOM则承载着整 ...

  5. 《高性能javascript》 领悟随笔之-------DOM编程篇

    <高性能javascript> 领悟随笔之-------DOM编程篇一 序:在javaSctipt中,ECMASCRIPT规定了它的语法,BOM实现了页面与浏览器的交互,而DOM则承载着整 ...

  6. 高性能JavaScript(您值得一看)

    众所周知浏览器是使用单进程处理UI更新和JavaScript运行等多个任务的,而同一时间只能有一个任务被执行,如此说来,JavaScript运行了多长时间就意味着用户得等待浏览器响应需要花多久时间. ...

  7. 【读书笔记】读《高性能JavaScript》

    这本<高性能JavaScript>讲述了有关JavaScript性能优化的方方面面,主要围绕以下几个方面: 1> 加载顺序 2> 数据访问(如怎样的数据类型访问最快,怎样的作用 ...

  8. 《高性能javascript》学习总结

    本文是学习<高性能javascript>(Nichols C. Zakes著)的一些总结,虽然书比较过时,里面的知识点也有很多用不上了,但是毕竟是前人一步步探索过来的,记录着javascr ...

  9. 《高性能Javascript》 Summary(二)

    第四章.算法和流程控制 Algorithms And Flow Control 原因:代码整体结构是执行速度的决定因素之一.代码量少不一定运行速度快,代码量多不一定运行速度慢.性能损失与组织代码和具体 ...

随机推荐

  1. 双向绑定 TwoWay MVVM

    1前台代码 <Grid> <StackPanel > <Grid x:Name="gridOne"> <Grid.Resources> ...

  2. 【python】按行切分文本文件

    python脚本利用shell命令来实现文本的操作, 这些命令大大减少了我们的代码量. 比如按行切分文件并返回切分后得到的文件列表,可以利用内建的split命令进行切分.为了返回得到的文件列表名,可以 ...

  3. Visual Studio跨平台开发实战(4) - Xamarin Android基本控制项介绍

    原文 Visual Studio跨平台开发实战(4) - Xamarin Android基本控制项介绍 前言 不同于iOS,Xamarin 在Visual Studio中针对Android,可以直接设 ...

  4. AspNetPager分页实际应用

    ---恢复内容开始--- 首先,这个分页是快速开发的一种,弊端就是一次查询数据库全部,然后分页显示. 注意: 1,最好绑定的数据是一个list格式! 1首先打开 http://www.webdiyer ...

  5. 判断DAG图

    拓扑排序O(E), bellman O(VE)   , 使用邻接表的dfs O(V+E) ,floyd O(N*N*N) bellman算法只能判断是否存在负环. 所以可以先把权值全部设为-1 #in ...

  6. libyuv编

     下载代码(墙): git clone http://git.chromium.org/external/libyuv.git 用 make 编译(linux.mingw.cygwin): mak ...

  7. Eclipse+Maven创建webapp项目<一> (转)

    Eclipse+Maven创建webapp项目<一> 1.开启eclipse,右键new——>other,如下图找到maven project 2.选择maven project,显 ...

  8. jQuery来源学习笔记:扩展的实用功能

    // 扩展的实用功能 jQuery.extend({ // http://www.w3school.com.cn/jquery/core_noconflict.asp // 释放$的 jQuery 控 ...

  9. Linux安装jdk 8和环境变量配置

    1.下载jdk 地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 2.将刚刚 ...

  10. Codeforces Round #258 (Div. 2) B. Sort the Array

    题目链接:http://codeforces.com/contest/451/problem/B 思路:首先找下降段的个数,假设下降段是大于等于2的,那么就直接输出no,假设下降段的个数为1,那么就把 ...