理解閉包之前我認為有必要了解javascript的變量作用域
# 變量作用域
JavaScript有兩種變量:局部變量和全局變量。
* 局部變量:是指只能在本變量聲明的函數內部調用。
* 全局變量:是整個代碼中都可以調用的變量。
我們知道,在JS中變量是需要用var關鍵字聲明的。但是JS中也可以隱式的使用變量,就是不用聲明,直接使用。而且,千萬注意,JS把隱式聲明的變量總是當成全局變量來使用。
# 閉包
## 概念
廣泛的定義就是:能夠訪問另一個作用域中變量的函數
專家定義:閉包是指有權訪問另一個函數作用于中的變量的函數
再精簡一些就是:能訪問局部變量的函數。
## 特點(現象/結果/用法)
1. 函數嵌套函數(函數內部又有函數)
2. 函數內部可以訪問函數外部的參數和變量
3. 能夠將變量保存在內存中(函數變量和參數不會被GC回收)
## 包含的要點
1. 函數聲明的時候,會生成一個獨立的作用域
2. 同一作用域的變量可以互相訪問
3. 作用域成層級包含關系,形成作用域鏈。子作用域的變量可以訪問父作用域的變量,反之不能;另外子作用域會使用最近的父作用域的變量
## 優缺點
優點:
* 可以將一個變量長期駐扎在內存中
* 避免全局變量的污染
* 私有成員的存在
缺點: 常駐內存,增大內存消耗,使用不當可能會造成內存泄漏
## 自執行函數的好處
* 隔離作用于,避免全局作用于污染
* 模擬塊級作用域