JS闭包问题

今天和同事聊天的时候,不经意间说起了JS。同事就给出了一段比较有意思的代码让我判断结果:

var data = [];
function test () {
    for (var i = 0; i < 3 ; i ++) {
	data[i] = function () {
		return i;
    	};
    }
}
test();
alert(data[0]());
alert(data[1]());
alert(data[2]());
大家判断下这三个alert分别会输出什么内容呢?

我全猜错了。

这段代码执行的结果是三个都会输出“3”。

由于JS知识的匮乏,我没有理解这其中的原理所在,我在上述代码之后,将data[0]、data[1]、data[2]打印出来后,发现三个的内容都是如下函数:

function () {
    return i;
}
原来这是因为每个data中的函数都保存了这个局部变量i的引用,因此导致其没有被JS垃圾回收机制回收,内存中仍然存在这个变量。而在for循环结束后,i的值已经变为了3,也就是说data中每个函数里的i都等于3,因此就会出现上述情况。

因为JS的特性,导致闭包只能取得函数中变量的最后一个值。

书到用时方恨少,平时学习知识都是浅尝辄止,会用就行,一旦遇到需要追寻到根源的问题时,就变得束手无策了。看来基础知识必须得打牢啊。





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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值