【问题标题】:Javascript: How to destroy the value a group of variables point to?Javascript:如何销毁一组变量指向的值?
【发布时间】:2012-01-16 22:51:53
【问题描述】:

所以我知道如何删除一个变量... variable = null;或删除变量;但是假设我有很多不同的变量都指向相同的值,但我只能访问其中的几个变量,我该如何清除该内存值。

那么举个例子……我有:

var a = {value:5};    //create the reference everything points to
var b = a;
var c = a;

CallFunctionThatKeepsReference(a);
//var x = a;          //x in this function but I can't directly access x.

a = null; b = null; c = null;    //the object still exists in x.
delete a; delete b; delete c;    //the object still exists in x.

//What can I do to accomplish this effect...
Nuke(a);  //or b, or c
//a,b,c,x now all point to null.

我无法访问 x,因为它保存在我调用的函数中。这是因为它是一个巨大的闭包并运行异步 setTimeout 代码,因此它永远不会打开。

【问题讨论】:

  • 我相当肯定delete 仅适用于对象属性。另外,内存管理通常留给垃圾收集器,你并没有那么高的控制度。
  • 你可以删除一个变量,它只是设置它等于'undefined'。但是如果另一个变量指向内存中的相同值,则内存不会被删除。
  • 不,您不能删除像abc 这样的变量。你可以删除a.value,但那是因为它是一个对象属性。 (developer.mozilla.org/en/JavaScript/Reference/Operators/delete)
  • 对不起,我没有提到这是在全球范围内。所以是的,在函数中 delete 不适用于变量,但在全局中它可以。

标签: javascript pointers memory-leaks


【解决方案1】:

我强烈推荐另一种方法。 JavaScript 不是 C,因此您不需要绝对明确地回收您自己的所有内存。相反,编写您的代码,使其与垃圾收集器一起工作。具体来说,确保您的变量在函数/闭包中声明,在您需要完成的最低级别。一旦函数完成,所有的变量和内存都会被自动回收。

【讨论】:

  • 这只是我使用保留传递给它的引用的函数的副作用。所以我永远不能让函数释放它,除非我自己做。
  • 您调用的函数是复制您传入的内容并将其永久保存在其他地方吗? (IE,一旦其他功能完成,它就不会超出范围?)否则,除了修复其他功能之外,您将无能为力 - 除非您可以访问其他功能所在的位置存储其副本。此外,您确定尝试这样的努力不会导致其他功能提供的功能出现意外问题吗?一个更完整的代码示例也会很有帮助。
  • 是的,基本上就是这样。我知道函数中的一个意外 null 是可以的,但如果没有什么可以解决问题,我想我必须移动一些东西来解决这个问题。感谢您的反馈。
猜你喜欢
  • 2013-05-24
  • 2018-07-03
  • 2023-04-01
  • 2012-12-23
  • 1970-01-01
  • 1970-01-01
  • 2012-02-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多