理解闭包之前我认为有必要了解javascript的变量作用域
# 变量作用域
JavaScript有两种变量:局部变量和全局变量。
* 局部变量:是指只能在本变量声明的函数内部调用。
* 全局变量:是整个代码中都可以调用的变量。
我们知道,在JS中变量是需要用var关键字声明的。但是JS中也可以隐式的使用变量,就是不用声明,直接使用。而且,千万注意,JS把隐式声明的变量总是当成全局变量来使用。
# 闭包
## 概念
广泛的定义就是:能够访问另一个作用域中变量的函数
专家定义:闭包是指有权访问另一个函数作用于中的变量的函数
再精简一些就是:能访问局部变量的函数。
## 特点(现象/结果/用法)
1. 函数嵌套函数(函数内部又有函数)
2. 函数内部可以访问函数外部的参数和变量
3. 能够将变量保存在内存中(函数变量和参数不会被GC回收)
## 包含的要点
1. 函数声明的时候,会生成一个独立的作用域
2. 同一作用域的变量可以互相访问
3. 作用域成层级包含关系,形成作用域链。子作用域的变量可以访问父作用域的变量,反之不能;另外子作用域会使用最近的父作用域的变量
## 优缺点
优点:
* 可以将一个变量长期驻扎在内存中
* 避免全局变量的污染
* 私有成员的存在
缺点: 常驻内存,增大内存消耗,使用不当可能会造成内存泄漏
## 自执行函数的好处
* 隔离作用于,避免全局作用于污染
* 模拟块级作用域