简单了解闭包

97 阅读3分钟

变量的作用域 

变量作用域分为两种:全局变量和局部变量  

  • 函数内部可以使用全局变量 
  • 函数外部不可以使用局部变量 
  • 当函数执行完毕,本作用域的局部变量会销毁 

什么是闭包 

闭包就是指有权访问另一个函数作用域中变量的函数。  

简单理解就是一个作用域可以访问另外一个函数内部的局部变量 在本质上,闭包就是将函数内部和函数外部连接起来的一座桥梁。 

 例题 

 函数一执行,会形成一个全新独立的私有作用域。 

当前函数执行,形成一个私有作用域a,a的上级作用域是谁,和他在哪执行的没有关系,和他在哪创建(定义)的有关系,在哪创建,他的上级作用域就是谁 


 堆内存和栈内存的释放 

堆内存:存储引用数据类型值(对象:键值对;函数:代码字符串)  

栈内存:提供JS代码执行的环境和存储基本数据类型 

堆内存释放 

让所有引用堆内存空间地址的变量赋值为null即可(没有变量占用这个堆内存了浏览器会在空闲的时候把它释放掉)  

栈内存释放

 一般情况下,当函数执行完成,所形成的私有作用域(栈内存)都会自动释放掉(在栈内存中存储的值也会释放掉),但也有特殊情况:

  •  函数执行完成,当前形成的栈内存中,某些内容被栈内存以外的变量占用了,此时不能释放(一旦释放,外面找不到原有的内容了) 
  • 全局栈内存只有在页面关闭的时候才会被释放掉 
  • 如果当前栈内存没有被释放,那么之前栈内存中存储的基本值也不会被释放 

例题 


闭包的特点(优点和缺点并存)

1. 延长了变量的生命周期
  •     优点: 因为执行空间不销毁, 变量也没有销毁
  •     缺点: 因为执行空间不销毁, 会一直存在在内存中
2. 可以访问函数内部的私有变量
  •     优点: 利用闭包函数可以访问函数内部的私有变量
  •     缺点: 执行空间不会销毁, 会一直存在在内存中
3. 保护私有变量(只要是函数, 就有这个特点)
  •     优点: 保护私有变量不被外界访问
  •     缺点: 如果向访问, 必须要利用闭包函数
闭包的函数的缺点 **致命**
  •     因为当一段内存空间中有一个不会被销毁的东西一直存在
  •     那么就会出现内存占用, 如果过多, 就会导致内存溢出
  •     那么结果就是 内存泄漏
闭包的作用
  •    就是当你需要延长变量的声明周期的时候
  •    或者你需要访问某一个函数内部的私有数据的时候
  •    你可以使用 闭包 函数来解决
   前提:
       如果有别的方法, 尽量不要使用闭包函数
      只有到没有招的时候, 我们在使用闭包函数
 闭包: 慎用