闭包是什么?作用域垃圾回收机制混合理解闭包

刚开始由这个例子才知道有闭包这个概念

for(var i=0;i<5;i++){
	obj[i].οnclick=function(){
		alert(i);
	}
}

以前新手的时候,常常会遇到这样的一种情况,我们为了简化代码,用for循环去为一些对象进行对应的事件的绑定。最后结果往往不能达到我们的要求。运气好的有前辈们告知。运气不好的,自己还在摸索。我很佩服那些靠自己摸索的,因为他们太惨了,但是很开心,我就是那个自我摸索的。让我们回到闭包的讨论中。

要理解闭包,先大概了解下什么是作用域。那作为新手,你只要了解,只有function才会导致作用域的变化。就是常说的函数级的作用域。

那我们先看看上面的例子 ,那既然function会创建新的作用域,那么alert(i);里面的i先在function里面找i,没有,那就只能到外面去找啦,很可惜,外面的i,在外面循环的时候已经达到了4,那们你所见到的就是你点击了无论哪个,弹出的都是4。

这就是这个问题导致了我们无法达到我们想要的结果。

那么什么是闭包呢?先看看这个函数;

function fn1(){
	var a=1;
	function fn2(){
	alert(a);
	a++;
	}
	return fn2;
}

那么fn2就是一个是个闭包。那还是不懂什么叫做闭包啊?a作用于fn1这个函数里面。如果我们在外面去访问a,那是访问不到的,对不对?

var aa=fn1();

好,我们在外部定义一个变量aa,是fn1,那fn1返回值,就是fn2,那么就是说,aa=fn2,那我们去执行一次

aa();

我们弹出的是1;

这个我们能理解,那执行完之后,a是多少了呢,a是通过上一级的作用域里面的a来保存的,那么就是说上一层的a保存了那个a++的值。

那么我们再去执行一次

aa();

那们我们这次弹出的是2,也就是说,我们执行了函数fn1两次,对于局部量a的是保存的!!那么这个a的值是如何保存的呢!

这里就是我们对于闭包正真的机制。

我们来分析下js是如何作用的

根据作用域我画了下面的图

那么看看aa,他引用了fn1,那fn2是fn1的子函数,但是fn2也引用了fn1作用域里面的变量a。

对于js的垃圾回收机制,当aa执行完毕,内存就被回收了,那么再开始回收fn1里的a,嗯?不行,他回收不了,为什么,因为有指针指向他。所以就就保存了其a的值。

对于垃圾回收机制不懂得可以去上网搜。

那么这里我们就实现了闭包的机制。保存了局部变量。在外面调用时,没有被垃圾回收。当再次调用时,变量依旧能访问到。

其实说道现在,已经说不下去了,因为,我觉得,当你理解作用域和垃圾回收机制,应该就差不多懂闭包了。

当然了闭包是进阶的时候看的东西,当你学会了常用的语法,那么我推荐两本书把

一本是effective javascript

一本是expert javascript,这两本书讲闭包的结合一下,或许对你有帮助,这个不是广告!!

还是觉得兴趣才是学习的最大动力之一,当然还有报酬。哈哈



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值