概念
当通过调用外部函数返回的内部函数后,即使外部函数已经执行结束了,但是被内部函数引用的外部函数的变量依然会保存在内存中,我们把引用了其他函数作用域变量的函数和这些被引用变量的集合,称为闭包(Closure),闭包是这些东西共同的组合。
简单来说,闭包是指有权访问另一个函数作用域中变量的函数。在JavaScript中,每个函数都是一个闭包,因为它们都可以访问自己的作用域内的变量,以及外层函数作用域内的变量,创建闭包的最常见的方式就是在一个函数内创建另一个函数,创建的函数可以访问到当前函数的局部变量。
闭包优点
- 创建全局私有变量,避免变量全局污染
- 可以实现封装、缓存等
闭包的缺点
- 创建的变量不能被回收,容易消耗内存,使用不当会导致内存溢出
- 解决: 在不需要使用的时候把变量设为
null
- 解决: 在不需要使用的时候把变量设为
使用的场景
- 创建全局私有变量
- 封装类和模块使用
- 实现函数柯里化
- 函数柯里化: 把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数。柯里化又称部分求值,字面意思就是不会立刻求值,而是到了需要的时候再去求值。
闭包一定会造成内存泄漏吗?
闭包并不一定会造成内存泄漏,如果在使用闭包后变量没有及时销毁,可能会造成内存泄漏的风险。只要合理的使用闭包,就不会造成内存泄漏。