Javascript学习笔记:闭包题解(3)

时间:2021-02-02 14:51:18

代码:

1 function assignHandler(){
2     var element=document.getElementById('someElementId');
3 
4     element.onclick=function(){
5         alert(element.id);
6     }
7 }

问题:请问以上代码是否存在内存泄漏?

正确答案:存在内存泄漏

解析:由于上段代码中存在闭包,闭包会保存包含该闭包的函数的作用域链,因此element对象会一直存在于内存中,不会被垃圾回收机制回收掉。那么怎么解决闭包内存泄漏的问题呢?闭包内尽量引用包含函数的值类型变量,不引用包含函数的引用类型变量,且必须在包含函数的最后将引用变量的值设置为null,断开变量名与对象之间的连接,这样对象便可正常回收,解决内存泄漏问题。代码如下:

 1 function assignHandler(){
 2     var element=document.getElementById('someElementId');
 3     var id=element.id;
 4 
 5     element.onclick=function(){
 6         alert(id);
 7     }
 8 
 9     element=null;
10 }