愚墨的博客
  • 首页
  • 前端技术
  • 面试
只争朝夕不负韶华
  1. 首页
  2. 前端技术
  3. 正文

js编程之惰性思想

2016年03月18日 4301点热度 0人点赞 0条评论

惰性思想:是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();
	}
})() 
标签: 暂无
最后更新:2016年07月27日

愚墨

保持饥渴的专注,追求最佳的品质

点赞
< 上一篇
下一篇 >

文章评论

取消回复

搜搜看看
历史遗迹
  • 2023年5月
  • 2022年9月
  • 2022年3月
  • 2022年2月
  • 2021年12月
  • 2021年8月
  • 2021年7月
  • 2021年5月
  • 2021年4月
  • 2021年2月
  • 2021年1月
  • 2020年12月
  • 2020年11月
  • 2020年9月
  • 2020年7月
  • 2020年5月
  • 2020年4月
  • 2020年3月
  • 2020年1月
  • 2019年5月
  • 2019年3月
  • 2019年2月
  • 2019年1月
  • 2018年9月
  • 2018年3月
  • 2018年2月
  • 2018年1月
  • 2017年11月
  • 2017年7月
  • 2017年6月
  • 2017年3月
  • 2017年2月
  • 2017年1月
  • 2016年12月
  • 2016年11月
  • 2016年9月
  • 2016年8月
  • 2016年7月
  • 2016年6月
  • 2016年5月
  • 2016年4月
  • 2016年3月
  • 2016年2月
  • 2016年1月
  • 2015年12月
  • 2015年10月
  • 2015年9月
  • 2015年7月
  • 2015年6月
  • 2015年4月

COPYRIGHT © 2020 愚墨的博客. ALL RIGHTS RESERVED.

THEME KRATOS MADE BY VTROIS