3

私がここで遭遇したこの奇妙な現象には特定の名前があるかもしれません。それが私が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で起こらないのですか?そして、もっと心配なことに、この種のコードは何らかの形で危険ですか?

ご協力いただきありがとうございます!

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

2 つのオブジェクト インスタンス、2 つの参照が保存されています。何もコピーされていないため、メモリリークのリスクはまったくありません。無限であるという「錯覚」を与えるだけですが、常に同じオブジェクトとそれらに割り当てられた同じメモリを指しています。

于 2012-07-06T04:04:19.287 に答える