【问题标题】:JavaScript objects: Destroying themJavaScript 对象:销毁它们
【发布时间】:2010-01-18 12:12:36
【问题描述】:

我必须维护一个包含大约 30-40 个属性的 JavaScript 对象,我每隔几秒就更新一次。我读过 JavaScript 中没有“释放”内存之类的东西,浏览器会自动垃圾收集未使用的内存。

我的问题是:将对象本身设置为null是否足够,还是我需要将其所有属性设置为null然后将其设置为null?

var obj = [];
obj[prop1] = "123";
obj[prop2] = "456"; 
//...and so on...

// now to release the obj, is it enough if I just did:
obj = null; 

【问题讨论】:

标签: javascript memory object


【解决方案1】:

在至少有一次引用变量之前,不会对变量进行垃圾回收。但是,请注意全局变量在“任何地方”都是可见的,并且有时可能不会被垃圾收集,因为它们仍然可以从某个地方看到。

例如,你有

var a = {"testkey": "testval"};

var b = jQuery.ajax({
   url:"http://somewhere",
   method: "GET",
   onSuccess: function() {
      //this function is called asynchronously, moments later,
      //but as "a" is defined in the enclosing variable scope,
      //you can access it from here
      alert(a.testkey);
   }
});

因此,我同意在您完成对象后将值设置为 null

【讨论】:

    【解决方案2】:

    一个对象只有在它不再可达时才能被收集。您可以通过将引用该对象的所有局部变量设置为 null(任何其他值也可以)并删除(或覆盖)引用它的其他对象的任何属性来实现此目的。

    删除对象自己的属性或将它们显式设置为 null 不会在这方面为您带来任何好处:如果对象的引用本身不存在,则不会将其视为“活动”。

    【讨论】:

      【解决方案3】:

      您需要将项目设置为null 的唯一时间(我能想到的)是涉及 DOM 的少数情况。

      例如,如果您的节点具有多个子节点,每个子节点都有一个由匿名函数定义的 onclick 处理程序,那么将每个 onclick 设置为 null 将是一个好主意(以避免无意的循环引用)。

      <div id="delete_me">
        <span></span>
        <span></span>
      </div>
      
      var theDiv = document.getElementById('delete_me');
      for (var i=0; i < theDiv.childNodes.length; i++) {
        theDiv.childNodes[i].onclick = function () {
          // stuff
        };
      }
      
      // Later...
      // Delete stuff.
      var divToDelete = document.getElementById('delete_me');
      
      // Remove all the onclicks
      for (var i=0; i < theDiv.childNodes.length; i++) {
        theDiv.childNodes[i].onclick = null;
      }
      
      // Delete the div
      divToDelete.parentNode.removeChild(divToDelete);
      

      【讨论】:

        【解决方案4】:

        不需要将属性设置为 null。存储在属性中的任何值都将被垃圾收集器释放。作为替代方案,delete 运算符可能会强制立即销毁:

        delete obj;
        

        【讨论】:

        • delete 不会强制对象销毁 - 它会从对象中删除属性;另外,不能删除局部变量;这样做甚至是严格模式 ECMAScript 5 中的语法错误
        猜你喜欢
        • 2012-05-02
        • 2012-04-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多