惰性思想:是js编程中一种比较常用的编程思想,主要是有用来处理兼容问题、多次进行同义词判断的问题。
惰性思想表示函数执行的分支只会在函数第一次调用的时候执行,在第一次调用过程中,该函数会被覆盖为另一个按照合适方式执行的函数,这样任何对原函数的调用就不用再经过执行的分支了。
举个例子,就比如说DOM二级事件中的addEventListener()来说,在IE中使用的是attachEvent(),兼容写法是:
function addEvent (type, element, fun) {
if (element.addEventListener) {
element.addEventListener(type, fun, false);
}
else if(element.attachEvent){
element.attachEvent('on' + type, fun);
}
}
addEvent函数是处理浏览器DOM二级事件的兼容函数。由于,各浏览之间的差异,不得不在用的时候做兼容检测。显然,单从功能上讲,已经做到了兼容浏览器。美中不足,每次绑定监听,都会对兼容做一次判断。然而,真正的应用中,这显然是多余的,同一个应用环境中,其实只需要检测一次即可。惰性思想就是将处理多部兼容的方法,在本次中重写为适合本浏览器的方法,以后再调用的时候就不用再判断兼容了。
优化之后应该是这样的:
function addEvent(type, element, fun) {
if (element.addEventListener) {
element.addEventListener(type, fun, false);
//符合当前浏览器的兼容方法就讲本方法中写
addEvent = function(type, element, fun) {
element.addEventListener(type, fun, false);
}
} else if (element.attachEvent) {
element.attachEvent('on' + type, fun);
addEvent = function(type, element, fun) {
element.attachEvent('on' + type, fun);
}
}
}
以上,第一次调用addEvent会对浏览器做兼容检测,然后,重写了addEvent。下次再调用的时候,由于函数被重写,不会再做兼容检测。
再来一个创建ajax实例的例子,因为在低级浏览器(IE5~6)中,创建ajax实例是通过 new ActiveXObject('Microsoft.XMLHTTP')来创建的。
code:
var getXML = function() {
if ('ActiveXObject' in window) {
return new ActiveXObject('Microsoft.XMLTHTTP');
}
if (window.XMLHttpRequest) {
return new XMLHttpRequest();
}
throw new Error('当前浏览器不支持ajax功能')
}
惰性函数
var getXML = function() {
if ('ActiveXObject' in window) {
getXML = funciton(){
return new ActiveXObject('Microsoft.XMLTHTTP');
}
return new ActiveXObject('Microsoft.XMLTHTTP');
}
if (window.XMLHttpRequest) {
getXML = funciton(){
return new XMLHttpRequest();
}
return new XMLHttpRequest();
}
throw new Error('当前浏览器不支持ajax功能')
}
自执行函数版
var getXHR = (function() {
if (window.ActiveXObject) {
return function() {
return new ActiveXObject('Microsoft.XMLTHTTP')
}
}
return function() {
return new XMLHttpRequest();
}
})()
文章评论