js 中的闭包是一个非常强大的特性,但是人们对其也有诸多误解。一种耸人听闻听闻的说法是闭包会造成内存泄漏,所以要尽量减少闭包的使用。

局部变量本来应该在函数退出的时候被解除引用,但如果局部变量被封闭在闭包形成的环境中,那么局部变量就能一直生存下去。从这个意义上来看,闭包的确会使一些数据无法及时被销毁。使用闭包的一部分原因是我们选择主动把一些变量封闭在闭包中,因为可能在以后还要使用这些变量,把这些变量放在闭包中和放在全局作用域对内存的影响是一致的。这里并不能说成是内存泄漏。如果将来需要回收这些变量,手动把这些变量设为null就可以了。

内存泄漏跟闭包有关系的地方是,使用闭包的同时比较容易形成循环引用,如果闭包的作用域链中保存着一些dom节点,这时候可能造成内存泄漏。但这本身并非是闭包的问题,也不是js的问题。在基于引用计数的垃圾回收机制中,如果两个对象之间形成了循环引用,那么这两个对象都无法被回收,但循环引用造成的内存泄漏在本质上也不是闭包造成的。

摘自Javascript设计模式与开发实践 / 曾探著