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

来源:互联网 发布:centos指令大全 编辑:程序博客网 时间:2024/04/30 01:34

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

for(var i=0;i<5;i++){obj[i].onclick=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
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 淘宝卖家不给赠品怎么办 淘宝赠品有瑕疵怎么办 淘宝赠品不发货怎么办 移动电视没信号怎么办 网络电视死机了怎么办 电视接收网络信号不好怎么办 tcl电视待机打不开怎么办 宽带电视看不了怎么办 电视总是闪退怎么办 电视出现系统更新怎么办 电视一直在更新怎么办 电视更新死机了怎么办 法院打电话不接怎么办 内向不敢辞职怎么办呀 生气后睡不着觉怎么办 被气得睡不着怎么办 一生气就睡不着怎么办 手机接电话声音小怎么办 发微信老公不回怎么办 欠钱没有欠条怎么办 朋友欠钱不还怎么办没欠条 个人欠销售货款怎么办 货款一直不还怎么办 欠钱不接电话找不到人怎么办 欠钱人电话不接怎么办 客户欠款不给怎么办 客户货款打一半怎么办 欠款人不到庭怎么办 别人打电话不接怎么办 百合注册被禁用怎么办? 监控显示未登录怎么办 发票认证了两次怎么办 拼多多账号异常怎么办 淘新闻账号异常怎么办 白领贷逾期了怎么办 用钱包信用不足怎么办 易借金app闪退怎么办 随心借不还款怎么办 苹果x来电显示慢怎么办 被垃圾短信轰炸怎么办 苹果手机被轰炸怎么办