从 JavaScript 中的局部变量释放内存

Posted

技术标签:

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

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

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

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

【问题讨论】:

【参考方案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 崩溃(不仅仅是显示“内存不足”消息),它可能与内存无关 - 我从未见过任何内存问题这样做,但我可能是错的。不过,这可能是任何数量的问题,我真的需要查看更多代码才能获得一个想法。

以上是关于从 JavaScript 中的局部变量释放内存的主要内容,如果未能解决你的问题,请参考以下文章

(二十六)成员变量与局部变量

全局变量和局部变量在内存中的区别

全局变量局部变量静态全局变量静态局部变量在内存里的区别

C语言中的“局部变量”是啥意思?

局部变量可能指向释放的内存

一维数组和面向对象基础知识