【含猜测】
js引用计数机制主要关注对象,一个对象若被引用的次数>0。则不能被回收。若引用次数=0。则应被回收。引用次数计数方法如下:
若其地址被赋给一个变量,则该对象引用次数++;若引用该对象的变量取得其它值则该对象引用次数--;
当该对象被创建时引用次数++(因为有一个引用)。当某个引用该对象的变量退出其环境时,该变量被销毁,则对象引用次数--;
循环引用由于处于循环中的每个对象都需要其它对象销毁才能使它的引用次数归零。因此,每个对象都无法归零引用次数。比如:A的一个对象属性引用B,B的一个对象属性引用A。则只有当B销毁,A的引用次数才能归零,同理只有A销毁B的引用次数才能归零。因此AB皆废。
循环引用导致内存泄露的一个例子:
function assignHandler(){
var element = document.getElementById('div');
element.onclick = function(){
alert(element.id);
};
}
上面的函数创建了一个div元素和其函数onclick之间的循环引用。值得注意的是函数闭包会引用包含它的函数的整个活动对象。因此有必要把element指空。element指空实际是去除了函数对元素的引用。
正确的方式:
function assignHandler(){
var element = document.getElementById('div');
var id = element.id;
element.onclick = function(){
alert(id);
};
element = null;
}
闭包应该是另一套机制,返回的函数若引用外层函数的某个变量,则外层函数内所有变量常驻内存,直到返回的函数引用次数归零。 |
|