2016-10-03 53 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 :)我会照顾它下一次 –

相关问题