《高性能javascript》读书笔记:第八章 编程实践

避免双重求值

在程序中提取一个包含代码的字符串,然后动态执行它的四种方法:eval() ,function构造函数,setTimeout()和setInterval()

var num1=5,

  num2=6,

  result=eval("num1+num2");

  sum=new function("arg1","arg2","return arg1+arg2");

setTimeout("sum=num1+num2",100);

setInterval("sum=num1+num2",100);



当在js代码中执行另一段js代码时,会导致双重求值的性能消耗.首先会以正常的方式求值,然后在执行过程中对包含于字符串中的代码发起另一个求值运算.双重求值是一项代价昂贵的操作,它比直接包含的代码执行速度慢很多.

setTimeout()和setInterval()建议传入函数而不是字符串来作为第一个参数.

 

 

使用Object/Array直接量

在js中创建对象和数组的方法有多种,但使用对象和数组的直接量是最快的方式.

//创建一个对象

var myObject=new Object();

myObject.name="aaa";

myObject.count=50;

//创建一个数组

var myArray=new Array();

myArray[0]="bbb";

myArray[1]=34;

//使用直接量创建一个对象

var myObject={name:"aaa",count:50};

//使用直接量创建一个数组

var myArray=["bbb",50];



 

 

不要重复工作

 最常见的重复工作就是浏览器探测。下面是添加或移除事件处理器的示例,典型的跨浏览器的代码写法:

function addHandler(target,eventType,handler){

  if(target.addEventListener){//DOM2 Events

    target.addEventListener(eventType,handler,false);

  }else{//IE

    target.attachEvent("on"+eventType,handler);

  }

}

function removeHandler(target,eventType,handler){

  if(target.removeEventListener){//DOM2 Events

    target.removeEventListener(eventType,handler,false);

  }else{//IE

    target.detachEvent("on"+eventType,handler);

  }

}



 上面的方法在每次调用的时候都检查浏览器,检查是重复的,有下面两种方法可以避免重复

1,延迟加载

延迟加载意味着在信息被使用前不会做任何操作。比如前面的例子,没有必要判断用哪个方法去绑定或取消绑定事件处理器。彩用延迟加载的版本如下:

function addHandler(target,eventType,handler){

  if(target.addEventListener){//DOM2 Events

    addHandler= function(target,eventType,handler){                          target.addEventListener(eventType,handler,false);

     };

  }else{//IE

    addHandler=function(target,eventType,handler){

      target.attachEvent("on"+eventType,handler);

    };

  }

//调用新函数

  addHandler(target,eventType,handler);

}



取消绑定的方法和上面的差不多,就不写了。

这个方法在第一次被调用时,会先检查并决定使用哪种方法去绑定事件处理器.然后原始函数被包含正确操作的新函数覆盖.最后一步调用新的函数,并传入原始参数.随后每次调用addHandler()都不会再做检测,因为检测代码已经被新的函数覆盖

 

2,条件预加载

在脚本加载期间提前检测,而不会等到函数被调用.

var addHandler=document.body.addEventListener?   //三目运算符

          function(target,evetType,handler){

            target.addEventListener(eventType,handler,false);

          }:function(target,eventType,handler){

            target.attachEvent("on"+eventType,handler);

          };

预加载适用于一个函数马上就要被用到,并且在整个页面的生命周期中频繁出现的场合.

 

使用速度快的部分

1,位操作

考虑使用直接操作数字的二进制形式的位运算

2,尽量使用原生方法

 

 

posted on 2012-03-01 00:21  LCM  阅读(413)  评论(3编辑  收藏  举报

导航