javascript:确保关闭中的对象是垃圾回收

时间:2011-10-26 16:14:40

标签: javascript garbage-collection

我正在尝试确保当我完成它们时,将释放包含在闭包中的一些变量用于垃圾收集。我不确定天气将它们设置为未定义,或者删除它们就足够了。有什么想法吗?

// 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")
})

3 个答案:

答案 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?找到一些内容。