23

我有一个模型,它将“携带”(Model.validator)一个验证器实例,我需要验证器才能访问模型的属性。所以,我想出的是以下内容

var Validator = function(model) {
    this.model = model;
};

var Model = function() {
    this._attributes = {};
    this.validator = new Validator(this);
};

var model = new Model();

此代码在这两个对象之间创建循环引用。这是会导致内存泄漏的不良做法吗?关于如何实现它的任何其他想法?

PS 我在 Angular.js 范围内的对象之间看到了这样的循环引用。

4

3 回答 3

21

这种代码不会导致当今浏览器的内存泄漏;正如MDN 上提到的,所有主要的浏览器都带有标记和清除 GC(可以很好地处理循环)已经有一段时间了(例如,Firefox 本身从版本 3 开始就有循环收集器)。

从架构的角度来看,这种代码在两个对象之间引入了适度的紧密耦合(如果一个对象发生了很小的变化,则需要审查另一个对象以确定它是否也需要更改),因此应尽可能避免. 但它本身并没有错。

于 2013-05-02T09:33:51.707 回答
3

垃圾收集不会有问题:任何新的垃圾收集器 (>IE6) 都可以很好地处理循环引用!

如果您正在执行递归函数或打印对象,这可能是一个问题。

所以答案是:没问题,除非你自己搞砸了:-)

于 2013-05-02T09:34:15.217 回答
2

我确定不会有任何问题。大多数浏览器的 JS 解析器可以在垃圾收集时处理循环依赖。这里没有更多潜在问题。

于 2013-05-02T09:33:00.970 回答