对象之间的循环引用是不好的做法?

时间:2013-05-02 09:21:21

标签: javascript circular-reference

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

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

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

var model = new Model();

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

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

3 个答案:

答案 0 :(得分:20)

这种代码不会导致今天的浏览器出现内存泄漏;作为mentioned on MDN,所有主流浏览器都已经发布了标记和扫描GC(可以处理周期很好)一段时间了(例如Firefox本身从版本3开始就有一个循环收集器)。

从架构的角度来看,这种代码在两个对象之间引入了适度紧密的耦合(如果一个变化甚至是一个小的方式,另一个需要被审查以确定它是否也需要改变)并且因此应该是尽可能避免。但它没有任何内在错误。

答案 1 :(得分:2)

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

答案 2 :(得分:2)

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

如果您正在执行递归函数或打印对象,则可能会出现问题。

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