闭包(一)

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

如要了解闭包,就需要了解作用域链,作用域链本质上是一个指向变量对象的指针列表,它只引用,但不实际包含变量对象。

function createFunctions(){
	var result = new Array();
	for (var i = 0; i < 10; i++){
		result[i] = function(){
			return i;
		};
	}
	return result;
}
var resultarr = createFunctions()

上面例子中,result数组的每一项都是一个匿名函数,当createFunctions()函数在执行完毕后,其活动对象也不会被销毁,因为匿名函数的作用域链仍然在引用这个活动对象。换句话说,createFuctions()函数返回后,其执行环境的作用域链会被销毁,但它的活动对象仍然会留在内存中,直到匿名函数被销毁后,createFunctions()的活动对象才会被销毁。如下例,匿名函数仍然能访问到其包含函数中变量i的值。

console.log(resultarr[1]);//function(){return i;}
console.log(resultarr[1]())//10

但是在上例中,resultarr[1[()的值是10,而不是我们所期望的1。因为如前面所说,result数组中的每一项都是一个匿名函数,而这些匿名函数的作用域链其本质只是一个指针,不实际包含变量对象。所以,在createFunctions()函数中循环完毕后,i就已经被赋值为10,所以,数组中的每一项匿名函数被调用时,其函数中的i也都指向变量i,即10;要解决这个问题只需在为result[i]赋值匿名函数时,直接调用此匿名函数即可

 

 

function createFunctions(){
	var result = new Array();
	for (var i = 0; i < 10; i++){
		result[i] = function(){
			return i;
		}();
	}
	return result;
}
var resultarr = createFunctions()

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值