我有一个模型,它将“携带”(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范围内的对象之间看到了这样的循环引用。
答案 0 :(得分:20)
这种代码不会导致今天的浏览器出现内存泄漏;作为mentioned on MDN,所有主流浏览器都已经发布了标记和扫描GC(可以处理周期很好)一段时间了(例如Firefox本身从版本3开始就有一个循环收集器)。
从架构的角度来看,这种代码在两个对象之间引入了适度紧密的耦合(如果一个变化甚至是一个小的方式,另一个需要被审查以确定它是否也需要改变)并且因此应该是尽可能避免。但它没有任何内在错误。
答案 1 :(得分:2)
我确定不会有任何问题。大多数浏览器的JS解析器可以在垃圾收集时使用循环依赖。这里没有更多潜在的问题。
答案 2 :(得分:2)
垃圾收集不会有问题:任何新的垃圾收集器(> IE6)都可以正常处理循环引用!
如果您正在执行递归函数或打印对象,则可能会出现问题。
所以答案是:除非你搞砸了,否则没问题: - )