2016-10-03 52 views
2

我有一個JavaScript對象Team和一個Score代表點和其他一些功能。我想知道在將分數存儲在團隊的同時,是否可以將團隊存儲在分數中。JavaScript對象的孩子可以引用它自己嗎?

var Score = function(team){ 
    this.team = team; 
    this.points = 0; 
    ... 
} 

var team = { 
    name : 'Team 1', 
} 
team.score = new Score(team); 

這樣做的結果是,如果我登錄team.score.team.score.team.score.team.score.team.score.points = 0,這是完美的東西我編程,但它代表了一個危險的設置可能會崩潰舊的瀏覽器或導致任何其他問題?它看起來完全像一個無限循環,但Chrome似乎處理得很好。

有什麼理由不應該這樣做?

+2

我相信這是相當普遍的做法! :) – SysVoid

+2

不會被字符串化爲JSON。 – Teemu

+3

循環方面很好。請參閱'window.document.defaultView.document.defaultView'等... –

回答

1

好問題。

這被稱爲循環參考

表示您正在創建同一對象的嵌套引用。

瀏覽器中的垃圾收集:瀏覽器中垃圾收集器的主要功能是釋放內存,如果對象佔用的內存不再使用。但在循環引用

的情況下的對象被說成引用另一對象,如果前者具有 訪問後者(隱式或顯式)。例如, JavaScript對象具有到其原型(隱式 參考)和它的屬性值的參考(明確提及)

(來源MDN


這就迫使垃圾收集算法來防止對象被垃圾收集,這反過來又是內存泄漏。

根據MDN Mark and sweep algorithm在環形參考的情況下得到了改進,該參考足夠智能地去除這種類型的物體。

循環引用是IE < 8中的一個問題,它導致IE瀏覽器在這上面干擾線路。閱讀本link和這個one


IBM link

本文揭示了JavaScript的圓形參考與實例和清晰度上被攝體內存泄漏的光。


做出終審判決:更好的避免循環引用的對象,只有當其高度需要在程序員自行決定使用。由於現代瀏覽器的構建效率非常高,但作爲開發人員編寫代碼會導致不必要的內存消耗和泄漏,這不是一個好習慣。

+0

偉大的答案 - 內存泄漏是我正在尋找當我輸入無限循環 – Djave

+1

OP的代碼發佈的*代碼*不*導致舊IE的問題。這個問題只涉及DOM對象的圈子 – Bergi

-6
var Score = function(team,point){ 
    this.team = team; 
    this.points = 0; 
    ... 
} 

var team = { 
    name : 'Team 1', 
    point : 'point' 
} 
team.score = new Score(team); 
team.score = new Score(point); 

試試這個,也許它可以幫助您完成您

+0

歡迎來到SO!一個好的答案不僅是一個可證實的例子,而且還解釋了你爲什麼改變了,爲什麼改變了。這不僅有助於OP,而且每個人都可以學到一些東西。 – Rajesh

+0

感謝您的建議Rajesh :)我會照顧它下一次 –

相關問題