2013-05-02 2 views
22

나는 그것을 가진 (Model.validator) validator 인스턴스를 "운반"할 모델이 있으며, 나는 모델의 속성에 접근하기 위해 Validator가 필요하다. 그래서, 나는 다음과 같은개체 간의 순환 참조가 나쁜 습관입니까?

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

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

var model = new Model(); 

이 코드는 그 두 개체 사이의 순환 참조가 생성하는 것입니다 함께 올라와있다. 메모리 누수의 원인이 될 수있는 나쁜 습관입니까? 그것을 구현하는 방법에 대한 다른 아이디어?

P. Angular.js 범위의 객체간에 순환 참조를 보았습니다.

+6

@ArunPJohny :-) 자신을 망치지 않는 한 아무 문제 없습니다 : IE6에서 어쩌면 ...하지만 현대 JS 엔진은 완벽하게 GC주기를 처리 할 수 ​​있습니다. – georg

+3

@ArunPJohny : 일반 JS 객체이고 DOM을 포함하지 않는 경우 IE6에서도 예외입니다. – Bergi

+0

순환 참조는 직렬화 (예 : JSON.stringify()를 통해)시 – Uriel

답변

19

이러한 종류의 코드는 현재 브라우저에서 메모리 누수가 발생하지 않습니다. mentioned on MDN으로 모든 주요 브라우저는 얼마 동안 (예 : Firefox 자체에 버전 3 이후주기 수집기가 있음) 마크 - 앤드 - 스위프 GC (주기를 올바르게 처리 할 수 ​​있음)로 출하되었습니다.

아키텍처 관점에서 볼 때, 이러한 종류의 코드는 두 객체 사이의 중간 정도의 빡빡한 결합을 유도합니다 (한쪽이 약간 변경된 경우 다른 부분을 검토하여 변경해야하는지 결정해야 함). 따라서 결과적으로 변경해야합니다. 가능하면 피해야합니다. 그러나 본질적으로 잘못된 것은 없습니다.

+6

"중간 정도 커플 링 "- 당신은 과소 평가를위한 선물을 가지고 있습니다. –

+1

@ErickRobertson : 음, 다른 언어에서도 클래스 기반 상속이 있습니다. '친구', '그냥 일을 끝내자.'반사 ... 적어도 여기서 공용 인터페이스 만 있으면됩니다. :-) – Jon

2

분명히 괜찮습니다. 대부분의 브라우저의 JS 파서는 가비지 수집 중에 순환 의존성을 처리 할 수 ​​있습니다. 더 이상 잠재적 인 문제는 없습니다.

2

새 가비지 수집기 (> IE6)는 순환 참조를 잘 처리합니다. 가비지 수집에는 문제가 없습니다.

재귀 함수를 사용하거나 개체를 인쇄하는 경우 문제가 될 수 있습니다.

그래서 대답은 : 당신이