您当前的位置: 首页 > 学无止境 > JS经典实例 网站首页JS经典实例
javascript匿名函数与闭包-匿名函数与闭包【下】
发布时间:2016-10-21 16:27:50编辑:雪饮阅读()
块级作用域(私有作用域):
如for等类似语句在条件中声明的变量i在for循环结束后仍旧可以被访问,即便被重新声明。除非你重新赋值。否则将返回i在for循环中最后的值
这就证明了javascript是没有块级作用域的
用闭包就可以实现块级作用域:
function box(){
(function(){
for(var i=0;i<5;i++){
alert(i);
}
})();
alert(i);
}
box();
闭包实现封装:
方法一:
function Box(){
var age=100;//私有变量
//私有函数
function run(){
return '运行中';
}
//对外可见的公共接口
this.publicGo=function(){
return age+run();
}
this.getAge=function(){
return age;
}
}
var box=new Box();
alert(box.publicGo());
alert(box.getAge());
方法二:
function Box(value){
var user=value;
this.getUser=function(){
return user;
}
}
var box=new Box('雪饮');
alert(box.getUser());
var box2=new Box('杜敏捷');
alert(box2.getUser());
方法三(实现属性的实例共享):
(function(){
var user='';
//自我执行中构造函数只能以匿名函数赋值全局变量的形式声明
//否则外面无法new
Box=function(value){
user=value;
this.getUser=function(){
return user;
}
}
})();
var box=new Box('雪饮');
alert(box.getUser());
var box2=new Box('杜敏捷');
alert(box.getUser());
方法四(使用原型进行属性共享):
(function(){
var user='';
//自我执行中构造函数只能以匿名函数赋值全局变量的形式声明
//否则外面无法new
Box=function(value){
user=value;
}
Box.prototype.getUser=function(){
return user;
}
})();
var box=new Box('雪饮');
alert(box.getUser());
var box2=new Box('杜敏捷');
alert(box.getUser());
这种被共享的属性叫做静态属性
单例:像字面量这种永远只实例化一次,无法进行“第二次”(其它语言不是这样的)实例化就是单例。字面量声明方式是无法第二次实例化的。
在其它语言中也可以第二次实例化,但在内存中永远保持一个实例化。其它语言中第二次实例化其实还是返回第一次实例化的对象。
var box={
user:'雪饮',
run:function(){
return '运行中。。。';
}
}
字面量形式的封装:
var box=function(){
var user='雪饮';
function run(){
return '运行中。。';
}
return {
publicGo:function(){
return user+run();
}
};
}()
alert(box.publicGo());
对象扩展增强性封装:
function Desk(){}
var box=function(){
var user='雪饮';
function run(){
return '运行中...';
}
var desk=new Desk();
desk.publicGo=function(){
return user+run();
}
return desk;
}()
alert(box.publicGo());
关键字词:javascript,匿名函数,闭包