避免双重求值

eval()、Function()构造函数、setTimeout()、setInterval()。每个方法允许你传入一个javascript代码字符串并执行它。
例如:`setTimeout("sum=num1+num2",100);`
当你在javascript代码中执行另一段javascript代码时,每次调用都会创建一个新的解释器/编译器实例,非常消耗性能,代码执行速度会慢许多。

避免重复工作

最常见的重复工作:浏览器探测。
反例:
function addHandler(target,eventType,handler){
    if(target.addEventListerner){//DOM2 Events
        target.addEventListener(eventType,handler,false);
    }else{//IE9以下
        target.attachEvent("on"+eventType,handler);
    }
}
该例子乍一看似乎已经优化了,隐藏的性能问题在于每次函数调用时都做了重复工作。因为每次的检查过程都是相同的,看看指定方法是否存在。但是其实检查一次就够了。
解决方案:
1.延迟加载(Lazy Loading)
function addHandler(target,eventType,handler){
    if(targrt.addEventListerner){
        addHandler=function(target,eventType,handler){
            target.addEventListerner(eventType,handler,false);
        };
    }else{
        addHandler=function(target,eventType,handler){
            target.attachEvent("on"+eventType,handler);
        };
    }
}
//以上方法会在函数第一次调用时,检查并决定使用哪种方法去绑定事件处理器。然后原始函数被包含正确操作的新函数覆盖。
2.条件预加载(Conditional Advance Loading)
条件预加载会在脚本加载期间提前检测,而不会等到函数被调用时。
var addHandler=document.body.addEventListerner ? 
    function(target,eventType,handler){
        targrt.addEventListerner(eventType,handler,false);
    }:
    function(target,eventType,handler){
        target.attachEvent("on"+eventType,handler);
    };

Lizzy0077
73 声望7 粉丝

前端