Javascript递归父级->;儿童->;家长->;子引用,我是否需要使用其他引用?
这正是我在学习Javascript和同时制作应用程序的过程中遇到的问题Javascript递归父级->;儿童->;家长->;子引用,我是否需要使用其他引用?,javascript,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); 这会引起什么问题吗?因为我计划在我的应用程序中使用类似的东西 我之所以使用它,是因为我需要引用属于父对象的变量 这
var A = function (parent) {
this.parent = parent;
},
b = new Object();
b.a = new A(b);
这段非常简单的代码产生了一些非常有趣的东西
console.log(b.a.parent.a.parent.a);
这会引起什么问题吗?因为我计划在我的应用程序中使用类似的东西
我之所以使用它,是因为我需要引用属于父对象的变量
这几乎和我的问题一样。但是,我不能在这里使用闭包,因为我甚至没有最外层的函数
我的代码的精简版本如下:
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;
}
我需要用它们各自的画笔制作多个这些草稿行(修改的上下文对象)
我不知道该怎么办,这似乎是无害的,但我觉得这是一种不好的做法
我尝试过其他一些事情,比如在链接SO帖子中描述的闭包。但当然,这不起作用,因为我的Scratchpad函数不返回自身,而是返回一个修改过的ctx对象,所以任何闭包变量都会被垃圾收集(对吧?它们至少已经消失了)
我其余的尝试依赖于对Javascript对象行为的错误理解,因此这些都不值得一提
那么,我该怎么办呢?保持现状?或者你有什么更好的处理方法的建议吗?这称为循环参考 现代垃圾收集器(与Netscape 2.0相反)可以很好地处理它
请注意,旧版本的IE无法处理DOM对象和纯JS对象之间的循环引用。只要不需要将循环引用对象转换为JSON,使用循环引用对象就不会有问题 显然,递归对象结构不能很容易地表示为字符串,您将看到类似这样的错误
TypeError: Converting circular structure to JSON
在现代浏览器中,循环引用没有任何问题 但是,在实现递归算法时,您需要了解它们,或者至少有一种机制来检测它们。另外,默认情况下,
JSON.stringify
会抱怨循环引用,但这很容易解决