javascript中的无穷大引用是否存在任何问题(示例)

时间:2015-12-09 23:21:14

标签: javascript loops reference infinity

当事物以可无限访问的方式相互引用时,是否存在任何性能问题或事情需要解决?

这是一个例子......

var Foo = function () { 
    var self = this; 

    this.setBar = function (bar) {
        self.bar = bar;
        self.bar.foo = self;
    }
};

var Bar = function () {};

var foo = new Foo();
var bar = new Bar();
foo.setBar(bar);

// infinite references!
console.log(foo.bar.foo.bar.foo); 

2 个答案:

答案 0 :(得分:1)

需要注意的一些问题:

  1. 您无法在具有循环引用的对象上调用JSON.stringify()。实际上,JSON格式本身不允许指定循环引用。
  2. 您无法调用内部依赖JSON.stringify()的任何功能,以便序列化数据和/或通过网络发送扁平化对象。
  3. 只有非常聪明的代码(通过循环引用检测并做正确的事情)可以使用循环引用递归迭代。如果您的数据中包含循环引用,那么使用相对简单的递归迭代器创建无限循环相当容易。递归迭代代码也可以免受循环引用的影响,但使用ES6 SetMap对象透明地比使用ES5更容易。
  4. 只要您没有陷入其中一个循环迭代或需要用JSON表示您的数据结构,那么它没有什么特别的错误 - 有时它只是权宜之计做事。

    浏览器本身有很多这样的循环引用的例子。例如,整个DOM将此作为父项指向子项和子项指向父项。

     node.firstChild.parentNode.firstChild.parentNode.firstChild.parentNode === node
    

答案 1 :(得分:1)

您遇到的唯一问题是,您无法将其转换为JSON格式,但就是这样。

事实上,浏览器已经出现过这种情况。 global object有一个名为window的属性,它引用全局对象。

所以..

window.window.window.window.window === window