闭包参数的访问

原创 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,这样的情况使得垃圾回收机制得出其引用计数不为零的结论,从而造成内存泄露。

 

相关文章推荐

javascript技巧:用闭包传递参数

function aaa(s){ return function(){ alert(s); } } setTimeout(aaa...

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

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

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

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

Javascript闭包--循环中可以将每个对象当参数进行传递

“函数是不是闭包” 这种问题本身是不对的。虽然在网络上常见这种提法,但是其实是因为对 Javascript 实现机制不清楚胡乱猜测导致的误解。 首先,一个函数不管是不是匿名函数,和闭包之间根...

闭包的返回值和参数

// // ViewController.swift import UIKitclass ViewController: UIViewController { override func vi...

Python 函数式编程(高阶函数、把函数作为参数、map()函数、reduce()函数、filter()函数、自定义排序函数、函数返回函数、闭包、匿名函数、装饰器decorator)

一、函数式编程 什么是函数式编程? 函数:function 函数式:functional 函数不等于函数式,好比计算不等于计算机   函数式编程的特点: 把计算视为函数而非指令 纯函数...

Swift3.0通过闭包回调传递参数 / @escaping

Swift3.0通过闭包回调传递参数 / @escaping

Python函数小结(1)--参数类型(*, ** 的区别), 闭包

刚开始学习python,python相对于java确实要简洁易用得多。内存回收类似hotspot的可达性分析, 不可变对象也如同java得Integer类型,with函数类似新版本C++的特性,总体来...
  • elyaowu
  • elyaowu
  • 2015年04月02日 22:26
  • 337

利用闭包实现onclick事件传递参数

当触发点击事件,一个简单的例子。 闭包创建数组 window.onload = function (){ var lis = d...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:闭包参数的访问
举报原因:
原因补充:

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