Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript递归父级->;儿童->;家长->;子引用,我是否需要使用其他引用?_Javascript - Fatal编程技术网

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); 这会引起什么问题吗?因为我计划在我的应用程序中使用类似的东西 我之所以使用它,是因为我需要引用属于父对象的变量 这

这正是我在学习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 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
会抱怨循环引用,但这很容易解决