关闭

闭包参数的访问

513人阅读 评论(0) 收藏 举报
闭包函数内的变量是不能访问的
var db = (function(){
    var data = {"name":"huangbiao"};
    return function(key,val){
                if(val === undefined)
                {
                    return data[key];
                }
                else
                {
                    return data[key] = val;
                }
              }
})();

//从上面的alert可以看出db实际上是返回的函数,因此里面传递的参数就是对应这
//db指针指向function(key,val)的参数

//alert(data.name);//data是闭包内的变量,访问不了,浏览器报错
//弹出undefined
alert(db('x'));//data={"name":"huangbiao","x":}
//弹出1
alert(db('x',1));//data={"name":"huangbiao","x":"1"}
//弹出1
alert(db('x'));//data={"name":"huangbiao","x":"1"}
 
<script>
var MyNamespace={};
MyNamespace.Singleton=(function(){

	var privateAttribute1 = "privateAttribute1";
	var privateAttribute2 = false;
	var privateAttribute3 = [1,2,3];

	function privateMethod1(){
		alert("privateMethod1");
	}
	
	function privateMethod2(){
		alert("privateMethod2");
		
	}
	
	return {
		publicAttribute1:true,
		publicAttribute2:"publicAttribute2",
		publicMethod:function(){
			alert("publicMethod");
			alert(privateAttribute1);
		},
		publicMethod1:function(){
			alert("publicMethod1");
		},
		publicsetAttr2:function(){
//访问的属性是闭包内部的属性,不需要使用this关键字,不同的对象,是相互不受影响的。
			alert(privateAttribute2);
			privateAttribute2 = true;
		},
		publicgetAttr2:function(){
			alert(privateAttribute2);
		}
	};

})();

MyNamespace.Singleton.publicMethod();
MyNamespace.Singleton.publicsetAttr2();
MyNamespace.Singleton.publicgetAttr2();
</script>
 
备注:个人理解闭包:定义一个方法,里面属性和方法外部是不能访问的,因此返回一个对象或者是方法,通过这个对象和方法访问里面的属性或者方法。因此是方法和属性隔离。
 
 
所有的变量,如果不加上var关键字,则默认的会添加到全局对象的属性上去,这样的临时变量加入全局对象有很多坏处:
1、别的函数可能误用这些变量
2、造成全局对象过大,影响访问速度(因为变量的取值是需要从原型链上遍历的)
<script>
var MyNamespace={};
MyNamespace.Singleton=(function(){
	abc="ddd";
})();
 
alert(abc);//ddd
</script>
 
闭包的另一个重要用途是实现面向对象中的对象,传统的对象语言都提供类的模板机制,这样不同的对象(类的实例)拥有独立的成员及状态,互不干涉
 
 
内存泄露:
在不同的JavaScript解释器实现中,由于解释器本身的缺陷,使用闭包可能造成内存泄露,内存泄露时比较严重的问题,会严重影响浏览器的响应速度,降低用户体验,甚至会造成浏览器无响应等现象。
 
javascript的解释器都具备垃圾回收机制,一般采用的是引用计数的形式,如果一个对象的引用计数为零,则垃圾回收机制将会将其回收,这个过程是自动的。
 
例如对象A引用B,B引用C,而C又引用A,这样的情况使得垃圾回收机制得出其引用计数不为零的结论,从而造成内存泄露。

 

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:309426次
    • 积分:8708
    • 等级:
    • 排名:第2263名
    • 原创:1096篇
    • 转载:14篇
    • 译文:0篇
    • 评论:5条
    最新评论