2013-05-02 78 views
22

我有一個將攜帶(Model.validator)驗證程序實例的模型,並且我需要驗證程序才能訪問模型的屬性。所以,我想到的是以下內容對象之間的循環引用是一種不好的做法嗎?

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範圍內的對象之間看到過這樣的循環引用。

+6

@ArunPJohny這是沒有問題的:在IE6也許......但現代的JS引擎是完全能夠處理gc循環。 – georg 2013-05-02 09:30:20

+3

@ArunPJohny:即使在IE6中,如果它們是普通的JS對象並且不包含DOM – Bergi 2013-05-02 09:34:20

+0

請注意,循環引用在序列化時會引起問題(例如,通過「JSON.stringify()」) – Uriel 2017-09-17 15:32:22

回答

19

這種代碼不會導致今天的瀏覽器內存泄漏;作爲mentioned on MDN一段時間以來,所有主流瀏覽器都使用了標記掃描GC(可以處理週期很好)(例如,Firefox本身已經有了自版本3以來的循環收集器)。

從架構的角度來看,這種代碼引入了兩個對象之間適度緊密的耦合(如果其中一個變化很小,另一個需要審查以確定是否需要更改),因此應該儘可能避免。但它沒有任何內在的錯誤。

+6

「中等緊度耦合「 - 你有一個輕描淡寫的禮物。 – 2013-05-02 12:26:35

+1

@ErickRobertson:在其他語言中,還有基於類的繼承,「朋友」,「只是完成工作」,至少在這裏你只能使用公共接口。 :-) – Jon 2013-05-02 12:31:47

2

我確定不會有任何問題。大多數瀏覽器的JS解析器可以在垃圾收集時使用循環依賴。這裏沒有更多的潛在問題。

2

它不會成爲垃圾收集的問題:任何新的垃圾收集器(> IE6)將處理循環引用就好!

這可能是一個問題,但如果你正在做遞歸函數或打印對象。

因此,答案是:除非你搞砸了自己:-)

相關問題