闭包(1)

     闭包是指有权访问另一个函数作用域中的变量的函数。创建闭包的常见方式,就是在一个函数内部创建另一个函数,以createComparisonFunction()函数为例:

<script type="text/javascript"> 
	/*tag1与tag2是内部函数(一个匿名函数)中的代码,这两行代码访问了外部函数中的变量propertyName。即使这个内部函数被返回了,而且是在
	其他地方被调用了,但它仍然可以访问变量propertyName。之所以还能访问这个变量,是因为内部函数的作用域链中包含createComparisonFunction()
	的作用域。要彻底搞清楚其中的细节,必须从理解函数第一次被调用的时候都会发生什么入手。
	*/
        function createComparisionFunction(propertyName){
		   
		   return function(object1, object2){
		      var value1 = object1[propertyName];//tag1
			  var value2 = object2[propertyName];//tag2
			  
			  if(value1 < value2){
			     return -1;//如果第一个参数应该位于第二个参数之前,返回负数
			  }else  if(value1 > value2){
			     return 1;
			  }else{
			     return 0;
			  }
		   }
		}
</script>

       在另一个函数内部定义的函数会将包含函数(外部函数)的活动对象添加到它的作用域链中。因此,在createComparisonFunction()函数内部定义的匿名函数的作用域链中,实际上将会包含外部函数createComparisonFunction()的活动对象。图7-2展示了当下列代码执行时,包含函数createComparisonFunction()的作用域链 。

var compare = createComparisonFunction('name');



 

在匿名函数从createComparisonFunction()中被返回后,它的作用域链被初始化为包含createComparisonFunction()函数的活动对象和全局变量对象。这样,匿名函数就可以访问在createComparisonFunction()中定义的所有变量。更为重要的是,createComparisonFunction()函数在执行完毕后,其活动对象也不会被销毁,因为匿名函数的作用域链仍然在引用这个活动对象。换句话说,当createComparisonFunction()函数返回后,其执行环境的作用域链会被销毁,但它的活动对象仍然会留在内存中;直到匿名函数被销毁之后,createComparisonFunction()的活动对象才会被销毁。

图7-3展示了调用compare()的过程中产生的作用域

var result = compare({name:"Nicholas"}, {name:"Greg"});


        首先,创建的比较函数被保存在变量compare中。而通过将compare设置为null解除该函数的引用,就等于通知垃圾回收例程将其清除。随着匿名函数的作用域链被销毁,其他作用域(除了全局作用域)也都可以安全地销毁

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值