### 一:闭包
### 闭包是什么
红宝书上对于闭包的定义:闭包是指有权访问另外一个函数作用域中的变量的函数。
### 形成闭包的原因
内部的函数存在外部作用域的引用就会导致闭包。
### 闭包的作用
- 保护函数的私有变量不受外部的干扰。形成不销毁的栈内存。
- 保存,把一些函数内的值保存下来。闭包可以实现方法和属性的私有化
### 闭包使用场景
因为存在闭包的原因上面能依次输出1~10,闭包形成了10个互不干扰的私有作用域。将外层的自执行函数去掉后就不存在外部作用域的引用了,输出的结果就是连续的 10。为什么会连续输出10,因为 JS 是单线程的遇到异步的代码不会先执行(会入栈),等到同步的代码执行完 `i++` 到 10时,异步代码才开始执行此时的 `i=10` 输出的都是 10。
### 闭包使用场景
容易导致内存泄漏。闭包会携带包含其它的函数作用域,因此会比其他函数占用更多的内存。过度使用闭包会导致内存占用过多,所以要谨慎使用闭包
二:执行上下文
什么是执行上下文
简而言之,执行上下文是评估和执行 JavaScript 代码的环境的抽象概念。每当 Javascript 代码在运行的时候,它都是在执行上下文中运行。
执行上下文分为两种:全局执行上下文和函数执行上下文。
执行上下文中主要包括:词法环境(作用域链)和变量环境(vo)