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

标签 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); 

最佳答案

需要注意的一些问题:

  1. 您无法对具有循环引用的对象调用 JSON.stringify()。事实上,JSON 格式本身不允许指定循环引用。
  2. 您无法调用任何内部依赖于 JSON.stringify() 的函数来序列化数据和/或通过网络发送扁平对象。
  3. 只有真正智能的代码(通过循环引用检测并执行正确的操作)才能使用循环引用递归迭代某些内容。如果您的数据中有循环引用,那么使用看起来相对简单的递归迭代器创建无限循环是相当容易的。递归迭代代码也可以免受循环引用的影响,但使用 ES6 SetMap 对象透明地实现这一点比在 ES5 中更容易。

只要您不陷入这些循环迭代中,或者需要用 JSON 表示数据结构,那么它就没有什么特别的问题 - 有时这只是做事的权宜之计。

浏览器本身有很多此类循环引用的示例。例如,整个 DOM 都将 this 作为父点指向子点,子点指向父点。

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

关于javascript - javascript 中的无限引用是否存在任何问题(示例),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34190911/

相关文章:

javascript - 使用局部 View 或在 javascript 中生成 HTML?

javascript - 如何捕获手动点击事件

javascript:如何根据数据库值判断字段值是空字符串还是null

javascript - 我如何测试 Mocha/Chai 以验证是否为变量分配了值?

matlab - 在 Matlab 中更有效地遍历矩阵元素

php - 显示所有行并通过提交更新所有行

java - 卡在方法/类引用问题上(JAVA Basic)

C++ 传递临时堆栈对象作为对函数的引用

c++ - 如何在自定义类中启用 'auto loops'?

java - Java中行为接口(interface)类型的引用变量