防止两重求值
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);
};