Javascript学习笔记:闭包题解(3)
代码:
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 }