闭包是什么?作用域垃圾回收机制混合理解闭包
来源:互联网 发布: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,这两本书讲闭包的结合一下,或许对你有帮助,这个不是广告!!
还是觉得兴趣才是学习的最大动力之一,当然还有报酬。哈哈
- 闭包是什么?作用域垃圾回收机制混合理解闭包
- JavaScript垃圾回收、闭包、作用域
- js --- 闭包,垃圾回收机制
- [ JS 进阶 ] 闭包,作用域链,垃圾回收,内存泄露
- [ JS 进阶 ] 闭包,作用域链,垃圾回收,内存泄露
- [ JS 进阶 ] 闭包,作用域链,垃圾回收,内存泄露
- js闭包与垃圾回收
- 04期:从JS垃圾回收机制和词源来透视闭包
- 让人头大的闭包和垃圾回收机制GC
- js 作用域链&内存回收&变量&闭包
- 作用域链和闭包理解
- 作用域与垃圾回收机制
- python垃圾回收机制是什么
- javascript--闭包性质以及JS垃圾回收器
- js闭包引用以及垃圾回收探索
- python垃圾回收及闭包异常抛出
- 作用域/上下文的理解,闭包的理解
- 闭包作用域
- Online Judge for ACM-ICPC etc.
- Composer 安装(一)
- Composer 中国全量镜像(二)
- JSON解析_JSONKit
- FreeCMS视频教程-jdk环境搭建
- 闭包是什么?作用域垃圾回收机制混合理解闭包
- 单例模式
- 关于免流的.ovpn文件说明
- Java中的泛型 集合(Map) IO流
- 自定义ListView的下拉刷新和上拉加载更多
- SourceTree 各历史版本下载地址
- Spring+Spring MVC整合
- Set Matrix Zeroes
- 2003-Can't connect to MySQL server on 'localhost'(10038)