4

当这样定义一个类时:

var namespace = {};
namespace.appleClass = function() {
   this.collection = [];
};

namespace.appleClass.prototype.methodOne = function(arg) {
   this.collection.push(arg);
};

摆脱 this.collection 的方法很简单。

this.collection.length = 0;

我的问题是上面定义的方法会发生什么(关于namespace.appleClass.prototype)。JavaScript 如何处理它们?函数“存储”在哪里?如何释放存储空间?

上面的类可以这样使用。

var apple = new appleClass();
appleClass.methodOne(2);
appleClass.collection[0]// will be equal to two etc..

我知道如何清空 DOM 引用、COM 引用以及删除操作符背后的长篇故事。我不知道从“自定义原型”或“类”中删除函数和对它们的引用的最佳方法是什么。

4

2 回答 2

2

摆脱 this.collection 的方法很简单。

this.collection.length = 0;

这并没有摆脱数组,只是截断了它,所以它没有条目。要真正完全摆脱数组,请执行delete this.collection(这将完全删除引用数组的属性,使数组符合垃圾回收条件)或this.collection = null(这将释放对数组的引用,使其符合垃圾回收条件,但删除该属性,该属性仍将与值一起存在null)。

任何在this.collection其他地方没有被提及的东西都将有资格进行垃圾收集。何时(或确实是否)发生这种情况完全取决于 JavaScript 实现。

这就是关键点,真的:要在 JavaScript 中“管理”内存,您只需确保没有任何内容指向您不再想要的东西。通常这无论如何都会超出您的应用程序逻辑(您不再需要它,所以您放弃对它的引用)。如果您在设计代码时牢记闭包的工作原理,那么在大多数情况下,您无需担心内存管理。

在问题的评论中重新提出您的问题:

我正在研究下找到的方法namespace.appleClass.prototype。JavaScript 如何处理它们?函数“存储”在哪里?如何释放存储空间?

函数对象存储在堆中(几乎可以肯定;如果它仅由局部变量引用,一些引擎(如 Google 的 V8)可能会使用堆栈);代码所在的位置取决于实现。对函数对象的引用(以及对其代码的引用)存储在prototype对象 on的属性中appleClass。这些功能只有一个,由new namespace.appleClass原型链创建的所有实例共享。每个实例都没有单独的函数副本(只是对它的单独引用),因此无需担心在实例上“清理”该函数。

如果您在代码中的任何地方都不再需要该函数(例如,所有 appleClass实例不再需要它),您可以通过delete namespace.appleClass.prototype.methodOne) 摆脱它。这将从原型中删除该属性,从而释放其对函数对象的引用,从而释放其对函数代码的引用,然后所有这些都可以进行垃圾回收。但这将是非常不寻常的,并且单个函数在任何情况下都不会占用太多内存。

于 2012-12-02T10:15:31.037 回答
0

Setting a variable to null makes sure to break any references to objects in all browsers including circular references being made between the DOM elements and Javascript scopes. By using delete command we are marking objects to be cleared on the next run of the Garbage collection, but if there are multiple variables referencing the same object, deleting a single variable WILL NOT free the object, it will just remove the linkage between that variable and the object. And on the next run of the Garbage collection, only the variable will be cleaned.

于 2014-09-18T10:33:04.647 回答