闭包参数的访问

来源:互联网 发布:漫画教程软件下载 编辑:程序博客网 时间:2024/06/06 02:16
闭包函数内的变量是不能访问的
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是闭包内的变量,访问不了,浏览器报错//弹出undefinedalert(db('x'));//data={"name":"huangbiao","x":}//弹出1alert(db('x',1));//data={"name":"huangbiao","x":"1"}//弹出1alert(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,这样的情况使得垃圾回收机制得出其引用计数不为零的结论,从而造成内存泄露。

 

原创粉丝点击