【问题标题】:Memory release from local variable in JavaScript从 JavaScript 中的局部变量释放内存
【发布时间】:2011-02-10 12:15:14
【问题描述】:

我有一个 JS 函数,每隔几秒就会在页面上调用一次。这是一个 AJAX 更新的东西。

作为一个函数,我声明了局部变量。由于各种原因,我不想使用闭包或全局变量。

我从来没有考虑过这个,但是我需要在函数末尾释放/清除变量来释放内存还是 JS 会自动为我做这个?

【问题讨论】:

    标签: javascript memory


    【解决方案1】:

    变量一旦超出范围就会被释放,在你的情况下,在你的函数中声明的局部变量将被 js 垃圾收集器自动释放,你不必担心它们。

    【讨论】:

    • 这不是事实。在任何 JS 实现中都没有引用计数,只有垃圾收集。所有未引用的变量将在下一次收集后被释放,而不是“一旦超出范围”。
    【解决方案2】:

    Javascript 具有自动垃圾收集功能。你不需要释放任何东西。

    【讨论】:

      【解决方案3】:

      一般来说,不会。使用var 声明的变量是本地变量,在您返回时会被垃圾回收。如果省略var,则变量是全局变量,在某些情况下,使用delete 关键字可能对全局变量有用,但通常最好使用var 声明所有变量,以免污染@987654326 @命名空间。

      delete 在使用基于原型的继承时很有用,例如:

      function myclass() {
          this.variable = 'myvalue'
          ...
          delete this.variable // finished with this variable
      }
      var inst = new myclass()
      

      请记住,如果inst 被删除或超出范围(已收集垃圾),则其中的所有属性也将被删除。 delete 也可用于从哈希表中删除项目:

      var d = {}
      d['blah'] = 'myvalue'
      ...
      delete d['blah']
      

      存在 一些 浏览器特定的垃圾收集错误。例如,IE 有时会在清理 DOM 元素和闭包等中的属性时遇到问题,尽管我相信在 IE8 中已经减少了许多这些问题。

      【讨论】:

      • 谢谢。我可以跟进你的那个 IE 错误吗?我认为我实际上也在这样做。我有一个全局数组,每次 ajax 更新都会重置它。在每个周期结束时,我从ajax删除包含js数组更新的div(我需要将js发布到div而不是直接接受变量。这很复杂)并使用xx = [];清除数组为下一个周期做好准备。工作正常,除了半小时左右后 IE8 倒下。关于您的评论-清除数组的更好方法是什么? (注意我没有证据证明这是 IE8 崩溃,但是......)
      • 如果问题是特定于 IE 的,我建议阅读 msdn.microsoft.com/en-us/library/Bb250448 - 很可能是这些问题之一。如果它实际上使 IE8 崩溃(不仅仅是显示“内存不足”消息),它可能与内存无关 - 我从未见过任何内存问题这样做,但我可能是错的。不过,这可能是任何数量的问题,我真的需要查看更多代码才能获得一个想法。