#### 閉包產生的條件
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. 當程序運行需要的內存超過了系統所分配的內存時,就會拋出內存溢出的錯誤