3

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

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

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

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不会发生这种情况?而且,更令人担忧的是,这种代码有什么危险吗?

谢谢你的帮助!

4

4 回答 4

2

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

于 2012-07-06T03:37:42.743 回答
2

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

于 2012-07-06T03:39:01.887 回答
2

以下代码片段举例说明了两个属性都引用了同一个实例

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

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

于 2012-07-06T03:46:39.010 回答
1

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

于 2012-07-06T04:04:19.287 回答