您的位置:首页 > Web前端 > JavaScript

javascript(3、4)module模式、立执行函数(Evernote)

2016-03-13 16:05 423 查看
基本特征:

模块化

封装变量和function,不与全局的namaspasce接触,松耦合

只暴露public

1.varblogModule=(function(my){

//添加一些功能

returnmy;
}(blogModule||{}));----判断是否有存在blogmodule,不存在则直接复制为{};


2.varblogModule=(function(my){
varoldAddPhotoMethod=my.AddPhoto;

my.AddPhoto=function(){
//重载方法,依然可通过oldAddPhotoMethod调用旧的方法
};

returnmy;
}(blogModule));



通过这种方式,我们达到了重载的目的,当然如果你想在继续在内部使用原有的属性,你可以调用oldAddPhotoMethod来用

3.用闭包保存状态

理解:闭包直接可以引用传入的这些参数,利用这些被lock住的传入参数,自执行函数表达式可以有效地保存状态。

//这个代码是错误的,因为变量i从来就没背locked住
//相反,当循环执行以后,我们在点击的时候i才获得数值
//因为这个时候i才真正获得值
//所以说无论点击那个连接,最终显示的都是Iamlink#10(如果有10个a元素的话)

varelems=document.getElementsByTagName('a');

for(vari=0;i<elems.length;i++){

elems[i].addEventListener('click',function(e){
e.preventDefault();
alert('Iamlink#'+i);
},'false');

}

//这个是可以用的,因为他在自执行函数表达式闭包内部
//i的值作为locked的索引存在,在循环执行结束以后,尽管最后i的值变成了a元素总数(例如10)
//但闭包内部的lockedInIndex值是没有改变,因为他已经执行完毕了
//所以当点击连接的时候,结果是正确的

varelems=document.getElementsByTagName('a');

for(vari=0;i<elems.length;i++){

(function(lockedInIndex){

elems[i].addEventListener('click',function(e){
e.preventDefault();
alert('Iamlink#'+lockedInIndex);
},'false');

})(i);

}

//你也可以像下面这样应用,在处理函数那里使用自执行函数表达式
//而不是在addEventListener外部
//但是相对来说,上面的代码更具可读性

varelems=document.getElementsByTagName('a');

for(vari=0;i<elems.length;i++){

elems[i].addEventListener(

'click',(function(lockedInIndex){

returnfunction(e){

e.preventDefault();

alert('Iamlink#'+lockedInIndex);

};
})(i),'false');

}



4.模拟c++中的类!!!//创建一个立即调用的匿名函数表达式
//return一个变量,其中这个变量里包含你要暴露的东西
//返回的这个变量将赋值给counter,而不是外面声明的function自身

varcounter=(function(){
vari=0;

return{
get:function(){
returni;
},
set:function(val){
i=val;
},
increment:function(){
returni++;
}
};
}());

//counter是一个带有多个属性的对象,上面的代码对于属性的体现其实是方法

counter.get();//0
counter.set(3);
counter.increment();//4
counter.increment();//5



counter.i;//undefined因为i不是返回对象的属性i;//引用错误:i没有定义(因为i只存在于闭包)
2015年1月
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: