javascript设计模式-(七)

惰性加载函数

在 Web 开发中,因为浏览器之间的实现差异,一些嗅探工作总是不可避免。比如我们需要 一个在各个浏览器中能够通用的事件绑定函数 addEvent

常见写法 一

	var addEvent = function(elem, type, handler) {
		if (window.addEventListener) {
			return elem.addEventListener(type, handler, false);
		} else if (window.attachEvent) {
			elem.attachEvent("on" + type, handler);
		}
	};

常见写法 二

	//在代码加载的时候就立刻进行一次判断,以便让 addEvent2 返回一个包裹了正确逻辑的函数,目前的 addEvent

	//函数依然有个缺点,也许我们从头到尾都没有使用过 addEvent2 函数,这样看来,前一次的浏览器嗅探就是完全

	//多余的操作,而且这也会稍稍延长页面 ready的时间

	var addEvent2 = (function() {
		if (window.addEventListener) {
			return function(elem, type, handler) {
				elem.addEventListener(type, handler, false);
			}
		} else if (window.attachEvent) {
			return function(elem, tye, handler) {
				elem.attachEvent("on" + type, handler);
			}
		}
	})();

常见写法 三 ( 惰性载入函数方案 )

	//惰性载入函数方案,第一次进入条件分支之后,在函数内部会重写这个函数,

	//重写之后的函数就是我们期望的 addEvent 函数,在下一次进入 addEvent3 

	//函数的时候, addEvent3函数里不再存在条件分支语句

	var addEvent3=function(){
		if(window.addEventListener){
			addEvent3=function(elem,type,handler){
				elem.addEventListener(type,handler,false);
			}
		}else if(window.attchEvent){
			addEvent3=function(elem,type,handler){
				elem.attachEvent("on"+type,handler);
			}
		}
	}

函数反柯里化(uncurring)

反curring就是把原来已经固定的参数或者this上下文等当作参数延迟到未来传递.

	Function.prototype.uncurring=function(){
		var self=this;//只调用这个方法的函数对象
		return function(){
			var obj=Array.prototype.shift.call(arguments);
			return self.apply(obj,arguments);
		}
	}

	var push=Array.prototype.push.uncurring();

	(function(){
		push(arguments,4);
		console.log(arguments);
	})(1,2,3);
posted @ 2017-04-22 18:50  夜湫  阅读(178)  评论(0编辑  收藏  举报