变量的作用域
变量作用域分为两种:全局变量和局部变量
- 函数内部可以使用全局变量
- 函数外部不可以使用局部变量
- 当函数执行完毕,本作用域的局部变量会销毁
什么是闭包
闭包就是指有权访问另一个函数作用域中变量的函数。
简单理解就是一个作用域可以访问另外一个函数内部的局部变量 在本质上,闭包就是将函数内部和函数外部连接起来的一座桥梁。
例题
函数一执行,会形成一个全新独立的私有作用域。
当前函数执行,形成一个私有作用域a,a的上级作用域是谁,和他在哪执行的没有关系,和他在哪创建(定义)的有关系,在哪创建,他的上级作用域就是谁
堆内存和栈内存的释放
堆内存:存储引用数据类型值(对象:键值对;函数:代码字符串)
栈内存:提供JS代码执行的环境和存储基本数据类型
堆内存释放
让所有引用堆内存空间地址的变量赋值为null即可(没有变量占用这个堆内存了浏览器会在空闲的时候把它释放掉)
栈内存释放
一般情况下,当函数执行完成,所形成的私有作用域(栈内存)都会自动释放掉(在栈内存中存储的值也会释放掉),但也有特殊情况:
- 函数执行完成,当前形成的栈内存中,某些内容被栈内存以外的变量占用了,此时不能释放(一旦释放,外面找不到原有的内容了)
- 全局栈内存只有在页面关闭的时候才会被释放掉
- 如果当前栈内存没有被释放,那么之前栈内存中存储的基本值也不会被释放
例题
闭包的特点(优点和缺点并存)
1. 延长了变量的生命周期
- 优点: 因为执行空间不销毁, 变量也没有销毁
- 缺点: 因为执行空间不销毁, 会一直存在在内存中
2. 可以访问函数内部的私有变量
- 优点: 利用闭包函数可以访问函数内部的私有变量
- 缺点: 执行空间不会销毁, 会一直存在在内存中
3. 保护私有变量(只要是函数, 就有这个特点)
- 优点: 保护私有变量不被外界访问
- 缺点: 如果向访问, 必须要利用闭包函数
闭包的函数的缺点 **致命**
- 因为当一段内存空间中有一个不会被销毁的东西一直存在
- 那么就会出现内存占用, 如果过多, 就会导致内存溢出
- 那么结果就是 内存泄漏
闭包的作用
- 就是当你需要延长变量的声明周期的时候
- 或者你需要访问某一个函数内部的私有数据的时候
- 你可以使用 闭包 函数来解决
前提:
如果有别的方法, 尽量不要使用闭包函数
只有到没有招的时候, 我们在使用闭包函数
闭包: 慎用