闭包的一些问题

1.题目:

function test(){
	var arr = []
	for(var i = 0; i < 10; ++i)
		arr[i] = function (){
			console.log(i)
		}
	retunr arr
}
var a = test()
for(var j = 0; j < 10; ++j)
	a[j]()

上面这个问题,输出的全部都是10

解释:
1.只要在当前函数内部返回了函数,就会产生闭包,当前函数的作用域变量就不会释放
2.函数只有才执行的时候才会将引用变成具体的值,其他状态只存当前变量的引用

在对数组的元素赋值过程中,由于是立即执行的,所以数组索引的i会被立即替换成真实值,也就是1、2、…

但是对于每个console的i,由于未立即执行,所以会存在i的引用

在函数结束返回arr时,i的值是10(无论是不是var来声明的,因为存在GO里面和存在AO里面具有同样的效果),然后打印过程中打印的i还是test函数作用域(如果未用var声明,则是GO),所以打印的都是10

变种:

第一种:函数自调用

function test(){
	var arr = []
	for(var i = 0; i < 10; ++i)
		(function (j){
			arr[j] = function (){
				console.log(j)
			}
		})(i)---->函数自调用
	retunr arr
}
var a = test()
for(var j = 0; j < 10; ++j)
	a[j]()

第二种:使用let代替var来声明i

function test(){
	var arr = []
	for(leti = 0; i < 10; ++i)
		arr[i] = function (){
			console.log(i)
		}
	retunr arr
}
var a = test()
for(var j = 0; j < 10; ++j)
	a[j]()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值