一、什么是闭包:
1. 说到闭包,咱们应该就能联想到作用域了
2. js的作用域分两种:
a. 全局作用域
b.局部作用域(也叫块级作用域)
3. js中变量的访问是由内向外访问的,内部也可以访问外部的变量也叫关联到作用域链了
4. 如果我们先要访问内部的变量就需要使用到闭包了
二、闭包是怎么样形成的:
1. 闭包其实就是一种现象
2. 闭包的本质就是在一个函数内部创建另一个函数,通过函数内的变量访问函数外部的变量的规则,实则就是在外部访问函数中的变量
3. 闭包的形成过程有以下几种:
a. 外部函数中受保护的变量在函数内部使用
b. 内部函数被外部函数通过return返回
c. 使用全局变量接住被外部函数返回的内部函数
d. 使用全局变量调用返回的函数,调用结束后,由于内部函数中的变量还没有被函数的全局变量引用,所以无法释放内存,内存无法被释放就形成闭包了
三、闭包的特点:
1. 函数嵌套函数
2. 函数内部可以引用函数外部的参数和变量
3. 参数和变量不会被垃圾回收机制回收
四、闭包的优点和缺点:
4.1优点:
1. 保护变量安全,实现封装,防止变量声明冲突和全局的污染
2. 在内存中维持一个变量,可以做缓存 - (但是使用多了同时也是一项缺点,非常的消耗内存)
3. 匿名执行函数可以减少内存消耗
4.2缺点:
1. 被引用的私有变量不能被销毁,增大了内存的消耗,造成内存的泄露,解决方法是可以在使用完变量后,手动的给它赋值为 null
2. 其次由于闭包涉及到跨域访问的问题,所以会导致性能的损失,我们可以通过把作用域变量存储到局部作用域当中,然后直接访问局部变量,来减轻对运行的速度的影响