JS高阶编程之惰性函数和单例设计模式

开发过程中,多人开发,写不同模块,如果有一下需求:
天气信息管理(查询,设置地区…)A人员开发
新闻信息管理(查询,设置地区,修改…)B人员开发

若开发时都使用let,难保开发人员命名一致:

//天气模块---A开发
let queryWeather = function (){
	//...
}
let setCity = function (){
//...
}
//新闻模块 ----B开发
let queryNews = function() {
//...
}
let setCity = function (){
//...
}

多个人代码合并时,可能编译阶段都编译不过去,会报错,所以可以使用闭包方式,将自己写的函数单独放进去:保护两个模块中的内容不冲突

//天气模块 ---A开发
(function(){
	let _default = 'beijing'; //默认的地点
	let queryWeather = function (){
			//...
		}
		let setCity = function (){
		//...
		}
})();
//新闻模块  ----B开发
(function(){
	let _default = 'beijing'; //默认的地点,不会冲突
	let queryNews = function(){
		//...
	}
})()

如果想在一个模块中使用另一个模块中的方法,可以怎么做?
在新闻模块中如果想使用天气模块中的设置地区,可以return一个对象,将被使用的方法暴露出去,在新闻模块中去调用天气模块的方法。
详细写法如下:

//天气模块这么写
let weatherModule = (function(){ //赋值的时候已经执行自执行函数
	let _default = 'beijing'; //默认的地点
	let queryWeather = function (){
			//...
		}
		let setCity = function (){
		//...
		}
		retuen {
		//ES6语法  setCity:setCity
			setCity
		}
})();
//新闻模块中:
let newsModule = (function(){
	let _default = 'beijing'; //默认的地点,不会冲突
	let queryNews = function(){
		//在此调用天气模块的setCity方法
		weatherModule.setCity();
	}
	//若没有想暴露的方法,直接return{}
	return {};
})()

只要想供外边使用的方法,都使用return返回出去。
以上的代码示例,这种方式称为单例设计模式(最原始的模块化思想),就是利用闭包机制,把写的方法包起来,保证自己的方法变量都是私有的,与别人写的不冲突;若想给别人用,就暴露出去。

在不使用react,Vue之前,都是使用这种模式,利用闭包的保护保存机制,防止冲突,想模块中方法互相调用,就使用这种单例模块化思想。

DOM2事件绑定:
标准的事件绑定:元素.addEventListner()
IE678事件绑定:元素.attachEvent()

写一个注册事件:
function emit(element, type, func){
		element.addEventListener(type,func,false);
	}
处理兼容:
function emit(element, type, func){
	if(element.addEventListener){
		element.addEventListener(type,func,false);
	}else if(element.attachEvent){
		element.attachEvent('on'+type ,func);
	}else{
		element.['on' + type] =func;
	}
}
emit(box, 'click' , fn1);
emit(box, 'click' , fn2);

执行emit()一次,就要走一遍以上的判断。

如果使用闭包,利用函数重写,写法如下,只判断一遍,下次调用时不会再进行判断,直接调用重写后的方法。

function emit(element, type, func){
	if(element.addEventListener){
		emit = function (type,func,false){
			element.addEventListener(type,func,false);
		}		
	}else if(element.attachEvent){
		emit = function (type,func,false){
			element.attachEvent('on'+type ,func);
		}		
	}else{
		emit = function (type,func,false){
				element.['on' + type] =func;
		}	
	}
	emit(element,type,func); 
}
emit(box, 'click' , fn1);
emit(box, 'click' , fn2);

以上就是js的惰性思想,惰性函数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值