由于闭包携带着包含它的函数的作用域,所以往往比普通函数占用更多的内存,但是闭包本身并不会造成内存泄漏,用法不当才会造成这个结果,所以使用闭包需谨慎。
造成内存泄漏的情况一般有以下两种:
1.在闭包的作用域链中引用了html元素未释放内存
由于本身html元素是不会被回收的,所以闭包中占用的内存也无法被回收,如:
function A(){ var a = document.getElementById("aid"); a.onclick = function(){ //事件处理代码 } }在这段代码中,函数A内存在一个匿名函数,由于这个匿名函数有着对a的引用,所以导致了a占用的内存会一直存在。
解决方法:
用完后把a变量设置为null,解除闭包对a的引用,这样就能确保内存正常回收了。
function A(){ var a = document.getElementById("aid"); a.onclick = function(){ //事件处理代码 } a = null; }
2.出现了循环引用
闭包中的循环引用会导致内存永远都不能被释放,如果是A->B,A指向B,当A被释放之后,已经没有指针指向B了,这是B占用的内存也能被释放;
但是,如果是A->B, B->A,形成了循环之后,A,B占用的内存将一直存在。