闭包
一、概念
当通过调用外部函数返回的内部函数后,即使外部函数已经执行结束,但是被内部函数引用的外部函数变量依然会保存在内存中。我们把引用了其他函数作用域变量的函数和这些被引用变量的集合,称为闭包(Closure)。
二、闭包实现
闭包指的是一个函数可以访问它定义时所在的词法作用域以及全局作用域中的变量。以js为例:
具体的说就是:当内部函数引用外部函数变量时,外部函数的作用域将被保留在内存中,以便内部函数可以访问这些变量。
三、用途
3.1、封装私有变量
闭包可以用于封装私有变量,防止其被外部访问和修改。
3.2、缓存
函数一旦执行完毕,其内存就会被销毁,而因为闭包,其内部作用域的内存得以保存。
3.3、模块化编程(实现共有变量)
闭包还可以用于实现模块化编程。模块化编程是一种将程序拆分为小的,独立的,可重用的模块编程风格。闭包可以用于封装模块的私有变量和方法,以防止其被外部访问和修改。
四、缺点
闭包会引用外部函数变量,这些变量在外部函数执行完毕后没有被释放,会一直存在于内存中,总内存不变的情况下,可用内存变小。一旦形成闭包,只有在页面关闭后,闭包占用内存才会被回收,会导致内存泄漏。
五、处理
- 及时释放闭包。手动调用闭包函数,并将其返回值赋值为null,如此可以让闭包中的变量即使被垃圾回收器回收。
- 使用立即执行函数。创建闭包时,将需要保留的变量传递给一个立即执行函数,并将这些变量作为参数传递给闭包函数。这样即可以保留所需变量,而不会导致其他变量的内存泄漏。