闭包的理解
在理解闭包之前,我们首先得知道,JavaScript垃圾回收,以及JavaScript作用域链
JS中内存的分配和回收都是自动完成的,内存在不使用的时候会被垃圾回收器自动回收
如果不了解JS的内存管理机制,非常容易造成内存泄露(内存无法被回收)的情况
注意:全局变量一般不会被回收,一般局部变量的值,不再使用后,会被回收
总结:所谓垃圾回收,核心思想就是如何判断内存已经不再会被使用后,就视为垃圾,释放掉
两种方式判断是否回收:引用计数算法和标记清除算法
IE采用的就是引用计数算法
引用计数算法,定义内存不再使用的标准,就是看一个对象是否有指向它的引用
如果每当多一个引用,则会在当前内存空间的引用次数+1,
如果每当少一个引用,则会在当前内存空间的引用次数-1,直到0为止,说明当前引用的对象不再需要
但它却存在一个致命的问题:循环引用。
如果两个对象相互引用,尽管不再使用,垃圾回收器不会进行回收,导致内存泄露

MDN的官方解释:闭包是函数和声明该函数的词法环境的组合
通俗一点就是:内部函数,调用外部函数的变量,从而形成闭包
一个简单的闭包实例:
function fn () { let count = 0 function add () { count++ console.log('fn函数被调用了' + count + '次') } return add } const addFn = fn() addFn()
在实际开发中,闭包最大的作用就是用来做“变量私有化”
如果count定义成全局变量,太容易被别人修改,所以可以利用闭包解决
闭包的缺点:由于标记清除法能够从根部访问到闭包的内存空间,会认为一直在被应用,从而不发释放,导致内存泄露
解决方法:断开该内存地址的引用
addFn = null


浙公网安备 33010602011771号