关于闭包

来源:互联网 发布:骑马与砍杀捏脸数据女 编辑:程序博客网 时间:2024/06/06 03:51

一直以来对闭包都是懵懵懂懂的状态,只是不知道从哪里看来的一些闭包的作用,就感觉已经掌握了,今天偶然间发现了一篇好文,链接如下:
http://kb.cnblogs.com/page/110782/
参考一下

什么是闭包,文章中有位大牛说从技术角度讲,js中所有的function都是闭包,从这个词来看,“闭包”,如果我们随便写一个函数,在函数中随便定义一个变量,在外部是访问不到的,这么理解这个变量被关闭包裹在了函数中,貌似很有道理啊,哈哈,不过这应该不算是真正意义上的闭包。

刚开始我以为,只要函数嵌套函数,内嵌的函数就被称为了真正意义上的闭包,但是有问题,直接看例子:
这里写图片描述

这里写图片描述
输出结果变了。
如果上面的例子也是闭包的话,那么他的作用很有限,并不能说明什么,但是下面的例子中却把我在不知道什么地方看到的闭包的作用理解的透彻了。
闭包的作用:

1、防止污染全局变量。如下图:
这里写图片描述
可以看到,随着函数box的执行,内部输出的值一直在加1,当我们给函数foo传值调用的时候,foo函数内嵌的函数box在调用该参数的时候会把这个参数关闭在自己的作用域中,保存在了内存中,在函数foo调用完毕之后并没有释放出来,所以每次调用都会保存上一次的值然后执行函数,所以会每次加1,全局变量number并没有变化。
2、可以在外部访问到内部的局部变量
这个很容易看得到。我们可以通过调用函数foo的内嵌函数(子函数)的方式来获取到函数foo的局部变量
这里写图片描述
如图,bar就是一个闭包,通过它可以访问name,age, sex三个变量
3、可以为外部提供公有属性或者方法
假设我们有一个隐藏对象,他含有一些属性或者方法,其中的某几个属性或者方法我们想让外部知道,同理:
这里写图片描述
如图,我们释放了对象obj的name和age属性,我们可以通过bar()获取到,但是其他属性和方法获取不到。

总结:一个函数A内部 return 一个B函数,并且B函数中调用了外部变量或者A函数的参值或者A函数中定义的局部变量,并且在外部调用函数A,并且访问了内部变量,就称B为一个闭包。

个人见解,有不对的欢迎指正。

原创粉丝点击