JavaScript对象的孩子可以引用自己吗?

时间:2016-10-03 10:15:10

标签: javascript circular-reference cyclic-reference

我有一个JavaScript对象Team和一个Score,它们代表点和其他一些功能。我想知道在将分数存储在团队中的同时将团队存储在分数中是否安全。

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 个答案:

答案 0 :(得分:1)

顺便说一句好问题。

这称为循环引用

表示您正在创建同一对象的嵌套引用。

浏览器中的垃圾收集:浏览器中垃圾收集器的主要功能是,如果对象占用的内存不再使用,则释放内存。但是在循环引用的情况下

  

如果前者有一个对象,则称该对象引用另一个对象   访问后者(隐式或显式)。例如,   JavaScript对象具有对其原型的引用(隐式   引用)及其属性值(显式引用)

(来源MDN

这迫使垃圾收集算法阻止对象被垃圾收集,这又是内存泄漏。

根据MDN Mark and sweep algorithm在圆形参考的情况下得到了改进,这种情况足以智能删除此类对象。

循环引用是IE中的问题< 8这导致IE浏览器对此进行干扰。阅读此link和此one

IBM link

本文阐述了JavaScript循环引用内存泄漏的示例和主题的清晰度。

最终裁决:最好避免循环引用的对象,只有在程序员自行决定时才需要使用。由于现在的浏览器非常有效,但作为开发人员编写导致不必要的内存消耗和泄漏的代码并不是一个好的做法。

答案 1 :(得分:-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);

试试这个,也许它可以帮到你