闭包是什么?
来源:广州中睿信息技术有限公司官网
发布时间:2012/10/21 23:25:16 编辑:admin 阅读 286
在模块化编程及oop方面确实闭包功不可没,但他也有很多不好的地方,比如ie中会造出内存泄露,调用外部变量引起的性能问题,绑定事件问题等等,不过还好世界上那么多伟大的js大牛都将很多问题解决了!其实跟

在模块化编程及oop方面确实闭包功不可没,但他也有很多不好的地方,比如ie中会造出内存泄露,调用外部变量引起的性能问题,绑定事件问题等等,不过还好世界上那么多伟大的js大牛都将很多问题解决了! 其实跟lanston交流了很久,这些关乎js底层的东西每个人多少都会有自己的见解,那么在我看来!闭包就是:在一个函数体内,内部函数拥有访问外部变量(除了this跟arguments)的权利,而此函数与它所处的这个环境组成了闭包!

通过作用域链解释闭包:

作用域链有函数定义时生成的一个scope属性以及在js解析过程中当执行某个函数时生成的属于那个上下文环境的作用域链!作用域链是以堆栈的形式储存数据的!前者与程序保持相同的生命周期,而后者与函数执行时的实例保持相同的生命周期! function Add(){ }创建时的作用域链

执行时的:var Total=add(5,10)

因为js是解释型语言,最不同于编译型语言的是它是边编译边执行的,只有词法分析与语法分析(可以说还有变量及函数的预解析吧),然后一块一块(<script>)的解析执行,所以在这一块script中出错是不会影响到另一块的! 在完成语法分析后便生成语法分析树(一些表,记录着程序的各种信息),而函数创建时生成的作用域链便包含在这里面!而程序(执行到那个函数时)执行时的作用域链先从函数的scope中复制数据过去,然后让活动对象(Activation object)进栈,该对象包含了函数的各种参数及局部变量! 而闭包有什么不一样呢?当闭包被创建时,它的作用域链是:

执行时的作用域链:(outerFunction虽然结束了,但它的活动对象没有释放)

所以闭包的内部函数一直保持可以调用外部函数的权利!

下面是个简单的例子

  function outerFunction(){  var outVar=0;  return function innerFunction(){       outVar++;       alert(outVar);  }  }  var instance=outerFunction();  instance();

程序输出 1 虽然outFunction已经没它的事了,但是innerFunction还是保持着访问outVar的权利!

 

联系我们CONTACT 扫一扫
愿景:成为最专业的软件研发服务领航者
中睿信息技术有限公司 广州•深圳 Tel:020-38931912 务实 Pragmatic
广州:广州市天河区翰景路1号金星大厦18层中睿信息 Fax:020-38931912 专业 Professional
深圳:深圳市福田区车公庙有色金属大厦509~510 Tel:0755-25855012 诚信 Integrity
所有权声明:PMI, PMP, Project Management Professional, PMI-ACP, PMI-PBA和PMBOK是项目管理协会(Project Management Institute, Inc.)的注册标志。
版权所有:广州中睿信息技术有限公司 粤ICP备13082838号-2