JS 一些优化性能的小细节

Github博客: github.com/aototo/blog
喜欢的朋友star 支持一下javascript

Js高性能优化小结

谨慎使用闭包

因为闭包[[Scope]] 属性包含与执行环境做用域链相同的对象引用,函数活动对象原本会随着执行环境完毕后一同销毁,但引入闭包,对象没法被销毁。html

闭包会形成更多的内存开销,同时IE下还会形成内存泄露。java

缓存对象成员

在同一个函数中,若是存在屡次读取同一个对象成员,能够在局部函数中保存对象,减小查找。git

function getWindowWH() {
    var elBody = document.getElementsByTagName('body')[0];
    return {
        width: elBody.offsetWidth,
        height: elBody.offsetHeight
    }
}复制代码

同时也解决了属性越深,访问速度越慢的问题。github

DOM 操做

访问DOM的次数越多,代码运行的速度越慢,统一的保存结果最后在一并输出。 例子:数组

function innerHTMLLoop() {
     var content = '';

     for (var count = 0; count < 10000; count++){
         content += 'a';
     }

     document.getElementById("idName").innerHTML += content;     
}复制代码

重绘(repaints)与重排(reflows)缓存

当页面布局和几何属性改变时就须要"重排"性能优化

避免在修改样式的过程当中使用 offsetTop, scrollTop, clientTop, getComputedStyle() 这些属性, 它们都会刷新渲染队列bash

  • 最小化重绘和重排, 尽可能一次处理闭包

    1. 使元素脱离文档流(隐藏元素
    2. 使用 documentFragment
    3. 将原始元素拷贝到一个脱离文档的节点中, 修改副本, 完成后再替换原始元素)

事件委托

当有不少元素须要绑定事件的时候,咱们一个一个的去绑定事件是有代价的的,元素越多应用程序越慢。事件绑定不但占用了处理时间,而且追踪事件须要更多的内存,有时候不少元素是不须要,或者是用户不会点击的,因此咱们须要使用事件委托来解决没有必要的资源消耗。

例子: 咱们需监听li的click事件,经过冒泡事件来获取点击的对象。

<ul> <li index='1'>1</li> <li index='2'>2</li> <li index='3'>3</li> </ul>复制代码
var ul = document.getElementById('ul');

ul.addEventListener('click', function(e) {
  var now_index = e.target.getAttribute('index');
  ...
})复制代码

循环性能

通常的for语句可能不少人都这么写

for(var i = 0; i < array.length; i++){
    ....
}复制代码

每次循环的时候须要查找array.length,这样不但很耗时,也形成性能损失。只要查找一次属性,存储在局部变量,就能够提升性能。

for(var i = 0, len = array.length; i < len; i++){
    ....
}复制代码

重写后的循环根据数组的长度能优化25%的运行时间,IE更多。因此平时书写的时候仍是要多加注意。同时仍是要避免使用for-in循环。

条件语句

if-else 对比 switch, 当条件语句较多的时候switch 更易读,运行的要更快。因此但条件少的状况下使用if-else,当条件增长时,更倾向于switch,会更佳合理。

避免使用构造器

经过避免使用eval()和Function()构造器来避免双重求值带来的性能消耗。好比:

eval('2 + 2');  复制代码

使用 Object/Array 直接量

直接量的速度回更快。

//bad
var myObject = new Object();
myObject.name = "xxxx";

//good
var myObject = {
    name: "xxxx"
}复制代码
相关文章
相关标签/搜索