javascript的闭包概念怎么理解
接触javascript很久了,每次理解闭包都似是而非,最近在找Web前端的工作,所以需要把基础夯实一下。
本文是参照了joy_lee的博客 闭包 在她这篇博客的基础上以批注的形式力争把我的理解阐述出来,如果有不当之处,欢迎批评指正。
《高级程序设计》上,这样说:当在函数内部定义了其他函数时候,就创建了闭包。闭包有权访问包含函数内部的所有变量。
(这句话怎么理解呢?照这句话理解的话,闭包就是一个嵌套函数嘛!嵌套函数对包含它的函数的变量当然可以访问,这是没有问题的。)
一般来说,内部函数是能够访问到上一级乃至全局的的变量的,那么就有人这样理解:通过闭包,可以实现外部访问函数局部内的变量。
(如果我们把作用域简单的分个级的话,假设全局作用域作为第一级,其中定义的函数体内部作用域作为第二级,在第二级作用域内嵌套定义的函数体内部作用域作为第三级,....等等,传统意义上,第一级不能访问第二级的变量(这种变量叫做局部变量),第二级不能访问第三级,...,而反过来是可以的,这就是作用域链。本级作用域内找不到再到上一级找,直至第一级全局。而闭包这种机制可以在第一级作用域中通过第三级作用域引用到第二级作用域中的变量,而方法就是在第二级作用域向第一级作用域返回拥有第三级作用域的函数引用。 这个引用才是关键,因为这个引用的存在,相关的第三作用域与第二作用域都成了这个引用运行的上下文,迫使垃圾回收机制GC不能回收这条链上所占用的资源。而如果没有这个引用,则跟一般函数一样,函数运行完资源就会被回收。而我的疑惑也在于此,闭包单指函数中的嵌套函数还是指被第一级引用了的嵌套函数?还是都是?还是说闭包并不是嵌套函数而是嵌套函数被第一级作用域引用时所形成的这种机制?)
function a(){ var i=0; function b(){ alert(++i); } return b; } var c = a(); c();
即,闭包的作用就是在a执行完并返回后,闭包使得Javascript的垃圾回收机制GC不会收回a所占用的资源,因为a的内部函数b的执行需要依赖a中的变量。
由于闭包的存在使得函数a返回后,a中的'i始终存在,这样每次执行c(),i都是自加1后alert出i的值。
那么,如果a不返回函数b,情况就完全不同了。因为a执行完后,b没有被返回给a的外界,只是被a所引用,而此时a也只会被b引用,因此函数a和b互相引用但又不被外界打扰(被外界引用),函数a和b就会被GC回收。
实际上是就是闭包延长变量的生命周期。通常函数的作用域即变量会在函数执行结束后被销毁,但当函数返回一个闭包,只要闭包不被释放,整条作用域链都会占用内存。(闭包延长变量的生命周期,这是指被第一级引用的情况。但如果没有这个引用,闭包还能称其为闭包吗?)
说道作用域链:即 函数自己的作用域、上一层的函数的作用域....和全局作用域。访问一个变量时,自己的没有,就一层层往上找,直至全局,若还没有,就报错。
(很想吐槽一句,闭包的作用域链是弯的。)
PS: 有网友推荐了另一篇文章javascript闭包概念简单解析,是不是权威暂且不提,总算有一个明确的概念。
说了这么多,闭包到底是什么,下面做一下总结:
闭包是一个概念,它描述了函数执行完毕内存释放后,依然内存驻留的一个现象,只要把握这个核心概念,闭包就不难理解了。
-
国产电影制作的特效与国外的差距在哪里
中国和国外起跑线是不一样的,纵观发展史,虽然中国不停地努力缩小差距,但是技术上仍然落后美国一大截。下面是小编整理的国产电影制作的特效与国外的差距在哪里的相关内容,仅供参考,欢迎大家阅读。迪士尼的《奇幻森林》已经上映有一段时间。从万牛奔腾到随风而动的细...
-
客厅和卧室隔断怎么样
随着房价的不断上涨,很多人都喜欢在单间的空间里用隔断的手法来划分居室的空间。客厅与卧室间的`隔断是常见的一种方式,那客厅和卧室隔断怎么样呢?下面我们就去看看客厅和卧室隔断的优点吧。功能多样在小户型里,每一处设计都要做到物尽其用,隔断的好处当然不止在于...
-
Word三种排版小技巧推荐
快速剔除办公模板中的编号办公过程中常常要使用固定的模板,例如每次都在原有模板中修改填充在括号中的字母编号,如果旧的模板括号()中都已经填上了字符。由于字符的随机性,我们不好一次性删掉其中的'选项,只得多次批量删除。其实借助于Word的特殊替换,可快速完成替...
-
把Word转换成PPT的办法
我们通常用Word来录入、编辑、打印材料,而有时需要将已经编辑、打印好的材料,做成PowerPoint演示文稿,以供演示、讲座使用。如果在PowerPoint中重新录入,既麻烦又浪费时间。如果在两者之间,通过一块块地复制、粘贴,一张张地制成幻灯片,也比较费事。其实,我们可以利用Po...