Javascript递归父级 - >孩子 - >父母 - >孩子参考,我需要使用替代品吗?

时间:2013-09-24 17:23:19

标签: javascript

这是我在学习Javascript和同时制作应用程序的过程中遇到的问题。

var A = function (parent) {
    this.parent = parent;
},
    b = new Object();

b.a = new A(b);

这段非常简单的代码会产生一些相当有趣的东西。

console.log(b.a.parent.a.parent.a);

http://i.imgur.com/g6fw6mZ.png 这会导致任何问题吗?因为我打算在我的应用程序中使用类似的东西。

我使用它的原因是因为我需要引用属于父变量的变量。

这与here几乎相同。但是,我不能在这里使用闭包,因为我甚至没有最外面的功能!

我的代码的精简版本如下:

var Scratchpad = function (canvas) {
    var ctx = canvas.getContext('2d');
    ctx.childMustAccessThis = 3;

    ctx.Brush = new Brush(ctx);
    return ctx;
},
    Brush = function (parent) {
        this.parent = parent;

        // Other vars
    };

Brush.prototype.getContext = function () {
    return this.parent.childMustAccesThis;
}

我需要使用各自的画笔制作这些Scratchpads(修改后的上下文对象)的多个。

我不知道该怎么做,这似乎无害但是我觉得这是不好的做法。

我已经尝试过其他一些东西,例如链接的SO帖子中描述的闭包。但是,当然,这不起作用,因为我的Scratchpad函数不返回自身,而是返回一个修改过的ctx对象,所以任何闭包变量都是垃圾收集的(对吧?它们至少已经消失了)。

我的其余尝试依赖于对Javascript对象行为方式的错误理解,因此不值得一提。

那么,我应该怎么做呢?保持原样吧?或者你有什么建议可以更好地处理这个问题吗?

3 个答案:

答案 0 :(得分:3)

这称为循环参考。

现代垃圾收集器(与Netscape 2.0相反)将完全处理它。

请注意,旧版本的IE无法处理DOM对象和纯JS对象之间的循环引用。

答案 1 :(得分:1)

现代浏览器中的循环引用没有任何问题。

但是,在实现递归算法时,您需要了解它们或者至少有一个机制来检测它们。此外,默认情况下JSON.stringify会抱怨循环引用,但这很容易dealt with

答案 2 :(得分:0)

使用循环引用对象没有问题,只要您永远不需要将它们转换为JSON!

显然递归对象结构不能像String一样很容易地表示,你会看到类似这样的错误;

TypeError: Converting circular structure to JSON