相信写代码对于大部分人都不难,但想写出高性能的代码就需要一定的技术积累啦,下面是一些优化JavaScript代码性能的常见方法。

一.注意作用域

1.避免全局查找

使用全局变量和函数肯定要比局部的开销更大,因为要涉及作用域链上的查找,请看以下函数:

  function demo1() {
var imgs = document.getElementByTagName("img"); //获取页面所有img标签 for(var i = 0; i <= imgs.length; i++) {
imgs[i].title = document.title + "image" + i;
}
}

  上面的代码每执行一次for循环都会在全局寻找document,一旦循环次数很多,那么就严重影响了性能,我们可以在for循环开始之前就把document的引用保存在一个局部变量。改进代码如下:

 function demo1() {
var imgs = document.getElementByTagName("img"); //获取页面所有img标签
var doc = document; //局部引用全局变量document for(var i = 0; i <= imgs.length; i++) {
imgs[i].title = doc.title + "image" + i;
}
}

二.选择正确方法

1.优化循环

 for(var i = 0; i <=imgs.length; i++) {
//执行代码
}

上面代码每次执行循环都会重新计算imgs的长度,一旦循环次数很多,那么积少成多就会影响到代码性能,我们只需在for循环执行之前把imgs的长度保存在一个变量中即可,这样就不用每次都是计算imgs的长度,改进代码如下:

  var length = imgs.length;    //把imgs的长度保存在一个变量中
for(var i = 0; i <=length; i++) {
//执行代码
}    

2.尽量使用原生方法

只要有可能,使用原生方法而不是自己用javascript重写一个。原生方法是用诸如c/c++之类的编译型语言写出来的,所以要比JavaScript的快很多很多。

3.使用switch替代if-else

如果有一系列复杂的if-else语句,可以转化成单个switch语句则可以得到更快的代码。还可以通过case语句按照最可能的到最不可能的顺序进行组织,来进行进一步优化switch语句。

三.最小化语句数  

1.多个变量申明,javaScript代码中的语句数量也影响所执行的操作的速度,完成多个操作的单个语句要比完成单个操作的多个语句快。

  //四个语句申明变量,浪费!
var name = "Bill";
var age = 10;
var sex = "man"; //一个语句申明变量,干的漂亮!
var name = "Bill",
age = 10,
sex = "man";

2.插入迭代值,当使用迭代值(也就是在不同的位置进行增加或减少的值)的时候,尽可能合并语句。

 //两个语句,浪费!
var age = values[i];
i++; //一个语句,干的漂亮!
var age = values[i++];

3.使用数组和对象字面量,你可能看过两种创建数组和对象的方法:使用构造函数或是使用字面量,使用构造函数总是要用到很多语句来插入元素或定义属性,而字面量可以将这些操作在一个语句中完成。

  //4个语句创建和初始化数组,浪费!
var values = new Array();
values[0] = 123;
values[1] = 456;
values[2] = 789; //4个语句创建和初始化对象,浪费!
var person = new Object();
person.name = "Bill";
person.age = 10;
person.sayName = function () {
console.log(this.name);
} //1个语句创建和初始化数组,干得漂亮!
var values = [123, 456, 789]; //一个语句创建和初始化对象,干的漂亮!
var person = {
name : "bill",
age : 10,
sayName : function () {
console.log(this.name)
}
};

四.优化DOM交互

   1.使用文档碎片减少DOM交互次数,DOM交互越多,性能越慢。

  var list = document.getElementById("myList"),
item,
i; for (i = 0; i <= 10; i++) {
item.document.createElement("li");
list.appendChild(item);
item.appendChild(document.createTextNode(" Item" + i));
}

上面代码每执行一次for循环都会向DOM插入新的元素,一旦for循环次数很多,那么将严重影响代码性能,所以解决办法就是减少DOM交互,于是我们使用createDocumentFragment方法创建虚拟节点,把要插入DOM的元素先插入该虚拟节点,循环完之后再把虚拟节点插入DOM,虚拟节点是不会渲染出来的,只会渲染它的子节点。改进代码如下:

  var list = document.getElementById("myList");
fragment = document.createDocumentFragment(),
i; for (i = 0; i < 10; i++) {
item = document.createElement("li");
fragment.appendChild(item);
item.appendChild(document.createTextNode("Item" + i));
} list.appendChild(fragment);

2.使用innerHTML。有两种在页面上创建DOM节点的方法:诸如createElement()和appendChild()之类的DOM方法,以及使用innerHTML。当把innerHTML设置为某个值时,后台会创建一个HTML解析器,然后使用内部的DOM调用来创建DOM结构,而非基于JavaScript的DOM调用,由于内部方式是编译好的而非解释执行的,所以执行快的多。

3.使用事件委托,把事件绑定在祖先节点,由于有事件冒泡,当事件触发时根据event对象的target属性可以知道具体事件是在那个子元素发生的。从而执行不同的行为。这样就不必每个子节点都绑定事件。

js代码性能优化的几个方法的更多相关文章

  1. Babylon.js官方性能优化文档中文翻译

    在这里列出Babylon.js官方性能优化文档的中英文对照,并在CardSimulate项目里对其中的一些优化方法进行实践. How To 如何 Optimize your scene 优化你的场景 ...

  2. 多个JS文件性能优化

    页面中引入的JS文件是阻塞式加载的,这样会影响页面性能.以下是JS文件性能优化方法: 一:将所有的<script>标签放到页面底部,也就是</body>闭合标签之前,这能确保在 ...

  3. Python 代码性能优化技巧(转)

    原文:Python 代码性能优化技巧 Python 代码优化常见技巧 代码优化能够让程序运行更快,它是在不改变程序运行结果的情况下使得程序的运行效率更高,根据 80/20 原则,实现程序的重构.优化. ...

  4. JavaScript代码性能优化总结

    JavaScript 代码性能优化总结 尽量使用源生方法 javaScript是解释性语言,相比编译性语言执行速度要慢.浏览器已经实现的方法,就不要再去实现一遍了.另外,浏览器已经实现的方法在算法方面 ...

  5. 针对于Java的35 个代码性能优化总结

    针对于Java的35 个代码性能优化总结前言代码优化,一个很重要的课题.可能有些人觉得没用,一些细小的地方有什么好修改的,改与不改对于代码的运行效率有什么影响呢?这个问题我是这么考虑的,就像大海里面的 ...

  6. JS 之性能优化(1)

    了解JS性能优化是学习前端必备的一项技能.下面就简单的列出几点: 1.注意作用域,避免全局查找. 访问全局变量比访问局部变量慢,是因为需要遍历作用域链,查找作用域链需要额外的时间.所以在一个函数中,将 ...

  7. [Ext JS 4]性能优化

    一般的优化技巧 1. 检查你定义的时间监听器 正确的设置事件监听器对性能会有很大的影响. 举例来说, 在定义一个store的时候,设置一个load 的事件去触发从后台读取数据,如果设置single 的 ...

  8. Java开发代码性能优化总结

    代码优化,可能说起来一些人觉得没用.可是我觉得应该平时开发过程中,就尽量要求自己,养成良好习惯,一个个小的优化点,积攒起来绝对是有大幅度效率提升的.好了,将平时看到用到总结的分享给大家. 代码优化的目 ...

  9. [转] Python 代码性能优化技巧

    选择了脚本语言就要忍受其速度,这句话在某种程度上说明了 python 作为脚本的一个不足之处,那就是执行效率和性能不够理想,特别是在 performance 较差的机器上,因此有必要进行一定的代码优化 ...

随机推荐

  1. HDFS租约实践

    一.租约详解 Why租约 HDFS的读写模式为 "write-once-read-many",为了实现write-once,需要设计一种互斥机制,租约应运而生租约本质上是一个有时间 ...

  2. redis资料收集

    http://www.runoob.com/redis/redis-sets.html  redis set 使用 https://www.cnblogs.com/wanzaixiaoxin/p/49 ...

  3. LindDotNetCore~基于模块化注入的介绍

    LindDotNetCore相关介绍 相关模块 全局都是依赖DI 消息队列 NoSql Caching 仓储 服务总线 Solr 调度 日志 Asspect拦截组件 UAA授权 各种组件环境的搭建 各 ...

  4. 使用plenv安装perl,并使其支持多线程

    plenv与pyenv.rbenv等都是同类型软件中非常好用的,这三个软件不仅命名类似,操作方式也相差无几,节约了很多学习的成本,所以非常推荐: 安装使用plenv: git clone git:// ...

  5. nvm 装 nodejs 重启终端失效的解决方法

    (1) 安装 nvm wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.30.1/install.sh | bash (2) ...

  6. jsp 之 解决mysql不是内部或外部命令问题

    安装Mysql后,当我们在cmd中敲入mysql时会出现'Mysql'不是内部或外部命令,也不是可运行的程序或其处理文件. 打开我的电脑在我的电脑右键中选择属性,然后单击选择高级系统设置. 在系统属性 ...

  7. javascript编码标准

    前面的话 编码标准是有争议的.几乎每个人都有自己的标准,但对标准应该是什么样的,则似乎很少能达成共识.但编码标准意味着,通过共同语言和一致的结构,把开发人员从无意义的工作中解放出来.允许开发人员把创新 ...

  8. python获取指定目录下的所有指定后缀的文件名

    使用到的函数有: os.path.splitext():分离文件名与扩展名 os.path.splitext(file)[] 获得文件名 os.path.splitext(file)[] 获得文件扩展 ...

  9. 【dfs】POJ2386湖计数

    Lake Counting Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 34735   Accepted: 17246 D ...

  10. SLAM入门之视觉里程计(5):单应矩阵

    在之前的博文OpenCV,计算两幅图像的单应矩阵,介绍调用OpenCV中的函数,通过4对对应的点的坐标计算两个图像之间单应矩阵\(H\),然后调用射影变换函数,将一幅图像变换到另一幅图像的视角中.当时 ...