从 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 中的局部变量释放内存的主要内容,如果未能解决你的问题,请参考以下文章