【问题标题】:Why infinite objects dont break the flow in javascript?为什么无限对象不会破坏javascript中的流程?
【发布时间】:2012-07-06 03:30:42
【问题描述】:

我在这里遇到的这种奇怪现象可能有一个特定的名称,这可能是我在 Google 上找不到任何相关信息的原因。

我正在处理我的项目,我在我的检查器中发现了一个奇怪的物体。我的代码在许多文件中被破坏,并且同时发生了很多事情所以我没有立即注意到,但是当我打开我的对象时,我发现它是无限的。

我会尝试在这里重现我所做的:

var monkey = {dad: 1, son: 1, have: null};
var banana = {state: 1, eatable: 1, have: null};

monkey.have = banana;
banana.have = monkey;

console.log(monkey);

如果你检查“猴子”对象,并展开“有”道具,你会发现它永远不会结束。因为香蕉总是有猴子,猴子总是有香蕉,递归地。

(我认为这可能是由于 javascript 总是传递对对象的引用而不是实际值。)

我在其他语言中看到过这种情况,但它总是阻止执行并引发显式错误。

为什么 javascript 不会发生这种情况? 而且,更令人担忧的是,这种代码有什么危险吗?

感谢您的帮助!

【问题讨论】:

  • 称为循环引用
  • @renato 它与 bananamonkey 被引用的 instance 相同 - 调试器只允许您继续向下钻取属性...

标签: javascript object recursion circular-reference


【解决方案1】:

现代浏览器的垃圾收集器非常智能,可以检测到仅通过循环引用保持活动状态的对象并将它们都处理掉。很多语言都这样做;所有 .NET 的,Java、Ruby、Python……实现起来并不难。

【讨论】:

  • 难道不是只有引用,没有复制对象,所以没有车库,也没有内存泄漏的机会吗?
  • @SheikhHeera:一点也不。这与复制没有任何关系,而是当浏览器确定它“不再需要”一个对象时。如果没有垃圾回收,每个 new 对象,即使没有复制,也会导致内存泄漏。
【解决方案2】:

它被称为循环引用,它确实会在某些浏览器中引起问题(泄漏)。通常在 IE 中,当一个对象具有对 DOM 对象的循环引用(并且 DOM 元素被删除)时,会导致内存泄漏。大多数现代浏览器都解释了这种模式。

【讨论】:

  • 有意思,我用IE测试一下
【解决方案3】:

下面的 sn-p 举例说明了两个属性引用了相同的实例

http://jsfiddle.net/tyrmF/

var monkey = { name: "monkey boy", son: 1 };
var banana = { name: "ripe banana", eatable: 1 };

monkey.eats = banana;
banana.eatenby = monkey;

console.log(monkey);​

/* alerts "monkey boy" - original monkey instance */
alert(monkey.eats.eatenby.eats.eatenby.name);

​ 请注意,当您继续“向下钻取”属性时,会保留对原始对象的引用(值相同)。

【讨论】:

    【解决方案4】:

    两个对象实例,存储两个引用,仅此而已。没有任何内存泄漏的风险,因为没有任何内容被复制,它只是给人一种无限的“错觉”,但它总是指向相同的对象和为它们分配的相同内存。

    【讨论】:

      猜你喜欢
      • 2021-08-03
      • 1970-01-01
      • 1970-01-01
      • 2013-04-09
      • 1970-01-01
      • 1970-01-01
      • 2014-08-30
      • 1970-01-01
      • 2012-02-27
      相关资源
      最近更新 更多