避免双重求值
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);
};
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。