#### 闭包产生的条件
1. 函数嵌套
2. 内部函数引用了外部函数内的变量(变量/函数)
#### 闭包在实际开发中的使用场景
1. 将函数做为另一个函数的返回值
2. 将函数的形参作为实参传递给另一个函数调用
```
function fn1() {
var num = 10
function fn2(){
console.log(num)
}
return fn2
}
var fn = fn1()
```
```
function fn1(msg, time) {
setTimeout( function(){
console.log(msg)
}, time)
}
fn1('Jack learning')
```
#### 闭包的作用
1. 使用函数内部的变量在函数执行完后,仍然存活在内存中(延长了局部变量的生命周期)
2. 让函数外部可以操作(读写)到函数内部的数据(变量/函数)
3. 在函数外部能否操作函数内部的变量?不能,但是通过闭包可以实现操作函数内部的变量
4. 函数执行完毕后,函数内部声明的变量是否还存在?一般是不存在,存在于闭包中的变量才可能存在
#### 闭包的缺点及解决方案
1. 函数运行完毕后不能及时销毁,占用内存时间长,容易造成内存泄露
2. 使用完后即时清理,避免过多的未清除变量占用内存
#### 内存泄露
1. 内存泄露积累过多就容易造成内存溢出
2. 占用的内存没有及时释放
3. 开发中常见的内存泄露
1. 闭包
2. 占用内存很大的全局变量
3. 没有及时清理的计时器/定时器
#### 内存溢出
1. 当程序运行需要的内存超过了系统所分配的内存时,就会抛出内存溢出的错误