我是这样理解闭包的:说的通俗点就是闭包是嵌套的内部函数,也就是说闭包是包含被引用变量的对象。
那么如何产生一个闭包呢?
当嵌套的内部函数引用了外部函数的变量或者函数时,就产生了闭包。
可以看出,闭包的产生需要两个必要条件:
1.函数的嵌套
2.内部函数引用了外部函数的数据
如下:

这样就产生了一个闭包,内层的fun1函数引用了外部的fun函数的变量a
接下来我们让这段代码运行起来

打开控制台 看看闭包,我们先标记这样的断点


这样我们就通过内部函数引用外部函数的数据(可以是变量,函数等)就可以产生闭包
那么,我们为什么要使用闭包呢。
第一:在JS中,函数内部可以一层一层的向外读取变量直至全局变量,但有时候,我们需要倒过来,从函数外部读取函数内部的变量,这时候就需要闭包了。
就比如上面的例子,按照正常情况我们是不能够访问函数内部的变量的。但此时我们需要知道函数内部变量。我们就通过闭包读取到函数内部的变量,并将其返回(return)
就可以访问到了。
第二:在JS中,我们使用一个函数时,当它执行完,就会立即销毁,但此时出于某些需求我们需要暂时保存或者使用函数内的变量。此时,我们就可以使用闭包让函数内部的变量在执行完后,仍然在内存中,这样就可以延长局部变量的生命周期。
看下面的例子:

它的输出结果是2和3。那么说明,在每次函数执行完后,这个a变量并没有被销毁。
为什么会这样?
因为闭包没有消失的根本原因是 var result=fun()这句话,为什么呢,因为在函数执行完后,fun1这个函数本应该释放,然后被当做垃圾回收,但此时,由于result的存在,result指向了fun1这个函数对象,而return fun1 是返回的fun1的地址值。所以当fun1被释放之后,result还在指向着它函数对象(fun1的地址值),而函数对象关联着闭包,闭包里面有a,所以不会被当作垃圾回收。
在知道了闭包的定义和作用后,我们需要知道闭包的生命周期。
闭包在何时产生:闭包在内部函数定义执行完时就已经产生了,这里要注意,不是调用,而是定义。比如上面实际情况中在var a=1时,就已经产生了,是因为函数提升,内部函数已经创建了,但是如果变成 var f=function(){}这种,就是在这个完全定义完才会产生。根据不同情况而视
闭包何时死亡:包含闭包的对象成为垃圾对象时。比如上面的result=null