javascript(3、4)module模式、立执行函数(Evernote)
2016-03-13 16:05
423 查看
基本特征:
模块化
封装变量和function,不与全局的namaspasce接触,松耦合
只暴露public
通过这种方式,我们达到了重载的目的,当然如果你想在继续在内部使用原有的属性,你可以调用oldAddPhotoMethod来用
3.用闭包保存状态
理解:闭包直接可以引用传入的这些参数,利用这些被lock住的传入参数,自执行函数表达式可以有效地保存状态。
'click',(function(lockedInIndex){
returnfunction(e){
e.preventDefault();
alert('Iamlink#'+lockedInIndex);
counter.i;//undefined因为i不是返回对象的属性i;//引用错误:i没有定义(因为i只存在于闭包)
2015年1月
模块化
封装变量和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月
相关文章推荐
- javascript笔记(2)(Evernote)
- JSON要点
- js学习笔记1(从Evernote迁移)
- 浅谈Json解析与序列化
- JavaScript计算一个字符串最多重复的字符及出现次数
- {JSP}JSP页面的基本结构
- JavaScript中关键字之null和undefined
- 从servlet获得json数据Ajax解析到前台网页
- 浅谈JavaScript闭包
- 关于jsp中重定向的问题
- javascript设计模式-掺元类
- {JSP}安装运行及简单的JSP程序
- js数据层中间件单页运用简单构思和应用案例
- javascript 函数
- javascript设计模式-继承
- js学习笔记
- JavaScript创建变量语法
- Javascript中的function函数
- 让你的JS更优雅的小技巧
- 纯JavaScript在网页上实现”简书“的文章编辑器