这是我在学习Javascript和同时制作应用程序的过程中遇到的问题。
var A = function (parent) {
this.parent = parent;
},
b = new Object();
b.a = new A(b);
这段非常简单的代码会产生一些相当有趣的东西。
console.log(b.a.parent.a.parent.a);
这会导致任何问题吗?因为我打算在我的应用程序中使用类似的东西。
我使用它的原因是因为我需要引用属于父变量的变量。
这与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对象行为方式的错误理解,因此不值得一提。
那么,我应该怎么做呢?保持原样吧?或者你有什么建议可以更好地处理这个问题吗?
答案 0 :(得分:3)
这称为循环参考。
现代垃圾收集器(与Netscape 2.0相反)将完全处理它。
请注意,旧版本的IE无法处理DOM对象和纯JS对象之间的循环引用。
答案 1 :(得分:1)
现代浏览器中的循环引用没有任何问题。
但是,在实现递归算法时,您需要了解它们或者至少有一个机制来检测它们。此外,默认情况下JSON.stringify
会抱怨循环引用,但这很容易dealt with。
答案 2 :(得分:0)
使用循环引用对象没有问题,只要您永远不需要将它们转换为JSON!
显然递归对象结构不能像String一样很容易地表示,你会看到类似这样的错误;
TypeError: Converting circular structure to JSON