闭包参数的访问

原创 2013年12月04日 10:17:09
闭包函数内的变量是不能访问的
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,这样的情况使得垃圾回收机制得出其引用计数不为零的结论,从而造成内存泄露。

 

js变量:局部变量、全局变量、闭包

局部变量、全局变量      var a =1; function test(){ alert(a); var a = 2; ale...
  • wiaiya
  • wiaiya
  • 2016年10月11日 19:09
  • 2208

闭包参数的访问

闭包函数内的变量是不能访问的 var db = (function(){ var data = {"name":"huangbiao"}; return function(k...
  • hbiao68
  • hbiao68
  • 2013年12月04日 10:17
  • 626

iOS 之 (闭包)block传值

在iOSAPP开发的过程中 我们会用到很多需要传值的地方 传值的方式也多种多样 有:代理传值、通知传值、KVC、KVO、block、单例 等。其中block 因为其简洁实用规范的代码 无疑是大牛们传值...
  • baidu_31170383
  • baidu_31170383
  • 2015年10月01日 16:06
  • 320

Swift 各种闭包各种使用 && 设置参数,函数传值

Swift 各种闭包各种使用 && 设置参数,函数传值
  • weixin_35755389
  • weixin_35755389
  • 2016年10月27日 12:58
  • 2741

swift 之 如何在函数中把闭包作为参数 进行回调

在之前的OC中我们会经常在一个方法中使用BLOCK回调 来达到数据回传和 执行某些操作 在swift中我们使用闭包 可以达到同样的效果 自己通过对比block和各种测试 有了以下的写法 ,但是...
  • ERIC_Dream
  • ERIC_Dream
  • 2015年07月28日 14:15
  • 3513

属性正向传值

  • 2015年07月17日 15:53
  • 68KB
  • 下载

10019---JavaScript--闭包

私有变量可以用到闭包。 全局变量 函数可以访问由函数内部定义的变量,也可以访问函数外部定义的变量。 在web页面中全局变量属于 window 对象。 全局变量可应用于页面上的所有脚本。 全局和局部变...
  • xxxcyzyy
  • xxxcyzyy
  • 2015年12月14日 01:12
  • 321

php闭包中use(变量)的作用域

php闭包中use(变量)的作用域
  • flynetcn
  • flynetcn
  • 2015年10月23日 21:38
  • 3806

js 函数的参数 问题 arguments对象 及闭包

js 参数的传递  是按值传递,在函数内部对变量所做的操作,不会影响到外部的变量。但是如果传递的是复合类型的对象,在内部对其属性所做的操作,则会影响外部对象,这是按址传递。 例如 var ...
  • tustyao
  • tustyao
  • 2015年06月27日 23:35
  • 903

iOS中的闭包

//闭包     NSString* s = @"123";     void (^block)() = ^() {         NSLog(@"%@",s);     };   ...
  • jcp312097937
  • jcp312097937
  • 2014年08月13日 11:32
  • 4510
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:闭包参数的访问
举报原因:
原因补充:

(最多只允许输入30个字)