惰性思想:是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(); } })()
文章评论