Javascript 对象之间的循环引用是一种糟糕的做法吗?

Javascript 对象之间的循环引用是一种糟糕的做法吗?,javascript,circular-reference,Javascript,Circular Reference,我有一个将“携带”(Model.validator)一个验证器实例的模型,我需要验证器访问模型的属性。因此,我得出的结论如下 var Validator = function(model) { this.model = model; }; var Model = function() { this._attributes = {}; this.validator = new Validator(this); }; var model = new Model(); 此

我有一个将“携带”(Model.validator)一个验证器实例的模型,我需要验证器访问模型的属性。因此,我得出的结论如下

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

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

var model = new Model();
此代码在这两个对象之间创建一个循环引用。这是一种会导致内存泄漏的错误做法吗?关于如何实施它还有其他想法吗


另外,我在Angular.js范围内见过对象之间的这种循环引用。

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

这种代码不会导致当今浏览器的内存泄漏;因为所有主流浏览器都有标记和扫描GCs(可以很好地处理循环)已经有一段时间了(例如,Firefox自版本3起就有了循环收集器)


从体系结构的角度来看,这类代码在两个对象之间引入了适度的紧密耦合(如果一个对象发生了微小的变化,则需要对另一个对象进行检查以确定它是否也需要发生变化),因此如果可能的话,应该避免。但是它本身并没有什么问题。

对于垃圾收集来说,这不会是一个问题:任何新的垃圾收集器(>IE6)都可以很好地处理循环引用

但是,如果执行递归函数或打印对象,则可能会出现问题


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

@ArunPJohny:在IE6中也许。。。但是现代的JS引擎完全能够处理gc循环。@ArunPJohny:即使在IE6中也不行,如果它们是普通的JS对象并且不包含DOMNote,循环引用在序列化时会引起问题(例如通过
JSON.stringify()
“适度紧耦合”-你有一种轻描淡写的天赋。@ErickRobertson:在其他语言中也有基于类的继承,
friend
,“他妈的完成工作”反射。。。至少在这里,您只能在公共界面上混日子。:-)