请问,下面这段代码怎么导致内存泄漏了呢???各位大神评论解析得越详细越好。
是循环引用导致的,还是闭包导致的?
var user = {name: 'tom', age: 20, gender: 'male'}
var test = document.getElementByid('test')
test.onclick = function() {
test.innerHTML = user.name;
}
// ...后面还有很多其他操作,最后把user对象释放掉
user = null;
还有,就是下面这样写为什么可以减少内存泄漏呢
var user = {name: 'tom', age: 20, gender: 'male'}
var test = document.getElementByid('test')
(function (name) {
test.onclick = function() {
test.innerHTML = name;
}
})(user.name);
user = null;
你第一段和第二段程序中引用发生的层级不同,一个是在函数体内用匿名函数完成引用(第一段),一个是在外层引用传值(第二段)。
第一段这个匿名函数一直绑定到onclick上,所以绑定不解除,引用就不解除,所以即使后面对象变量已经解除绑定了,但对象实体并不能被销毁回收内存(那块实体内存区域还有引用)。
第二段通过一个全局匿名即时调用函数,把
user.name
引用的具体字符串内容地址给了局部name
变量,这个变量再被onclick
引用绑定,而字符串的定义JS中是专门区域的,实际上user.name
也仅仅是那个字符串区域的一个引用,所以实际上销毁user
仅仅是对原来user.name
所指区域进行一次减一次引用操作,而具体的区域并不会被回收,还可以被onclick
引用绑定。