我正在尝试确保当我完成它们时,将释放包含在闭包中的一些变量用于垃圾收集。我不确定天气将它们设置为未定义,或者删除它们就足够了。有什么想法吗?
// run once for each photo, could be hundreds
$("img.photo").each( function(){
// create the vars to put in the callback
var photo = $(this);
var tmp = new Image();
// set the callback, wrapping the vars in its scope
tmp.onload = (function(p,t){
return function(){
// do some stuff
// mark the vars for garbage collection
t.onload = ?
t = ?
p = ?
})(photo, tmp)
// set the source, which calls onload when loaded
tmp.src = photo.attr("src")
})
答案 0 :(得分:6)
查看at this post以获取有关垃圾收集的更多详细信息。
由于您要向.each
发送一个匿名函数,因此该函数将被垃圾收集。除了一部分:
// set the callback, wrapping the vars in its scope
tmp.onload = (function(p,t){
return function(){
// do some stuff
// mark the vars for garbage collection
t.onload = ?
t = ?
p = ?
})(photo, tmp)
将收集函数(function(p,t){ ... })(photo, tmp)
,因为它是匿名的,不再引用。但它返回的函数将被添加到tmp.onload
,这将持续存在。
如果你想确保收集的东西设置变量,当你完成它们时,要未定义或为null。这样,垃圾收集器将确保范围内没有引用,从而释放它们。
答案 1 :(得分:2)
当你的“onload”函数退出时,没有任何东西会引用闭包本身,所以整个东西都将被收集。
答案 2 :(得分:-3)
JavaScript负责处理范围已经为使用var keyword声明的变量执行的变量。
对于声明的对象,使用delete关键字释放内存。
x = new Object;
alert(x.value);
delete (x);
alert(x); //this wouldn't show
您也可以在What is JavaScript garbage collection?找到一些内容。