[读书笔记]高性能js-数据访问

我们都知道,利用js程序访问数据需要一定的时间。访问不同的数据以及数据存储的位置都会影响访问的效率。

在js中,数据存储和读取的位置有4种,分别是:

1 直接量:代表自身,不存储在特定的位置。6大基本js数据都有直接量。

2 变量 :var 定义的数据存储单元。

3 数组。

4 对象。

 

一般情况,对1和2的读写效率都是很高的,3,和4相比较低。所以通常的建议是减少3,4数据的使用,多使用1,2数据。

当然,我们也有别的方法进行优化。

 

如:管理作用域:

标识符越在作用域链的后面,搜索标识符所需要的时间越久。所以一般某个跨作用域的值在函数中引用一次以上,那个直接把这个值保存为函数的变量。如

function a(){

  var a=document.getElementById('a');

  var b=document.getElementById('b');

  var c=document.getElementById('c');

}

可以改写为

function a(){

  var doc=document;

  var a=doc.getElementById('a');

  var b=doc.getElementById('b');

  var c=doc.getElementById('c');

}

 

另外,可以利用with和try catch改变函数的作用域链,把另一个对象堆如作用域链的最前端,但是这会影响其他变量的搜索速度。

另外,js是动态作用域的,意思是只有函数代码在执行的时候才能确定用哪个变量。如

function a(code){
    eval(code)
    function sub(){
       return window  
}  
    var s=sub();
}    
直接调用a,s=window,那么s就是全局window的引用。但是code参数若为{“var window={}”},那s引用的就是局部变量window={}:

 

前面提到,访问对象要比访问字面量慢,这是为什么呢?

 

比如我们访问一个对象的属性,它要遍历对象所有的属性,比如查找window.location属性,会先遍历所有window的属性,再获得location属性。因此,遍历对象的属性所需要的时间通常比字面量长。另外对象的属性或方法的搜索是根据原型链搜索的,属性处于原型链越深处,搜索所需要是时间也就越久。所以,搜索window.a比搜索window.a.b所需要的时间短。

所以,和前面所说的一样,我们可以利用缓存对象属性的方法来提高访问效率。

比如 function a(){

  var body=document.body

  return body.a +body.b;

}

但是缓存对象属性的方法不适用在缓存对象的方法。因为把一个方法保存为一个局部变量,会导致方法中的this变为window。这一点要特别注意。

 

posted @ 2015-11-06 22:16  Debugor  阅读(195)  评论(0编辑  收藏  举报