3

JavaScript の循環参照の概念と、メモリ リークを防ぐために循環参照を回避することの重要性は理解していますが、クロージャーまたはプロトタイプのメンバーである関数をイベント ハンドラーに割り当てると、ガベージ コレクションにどのような影響があるかについての情報を見つけることができませんでした。

たとえば、次のいずれかを書いたとします。

var o = {};
o.var = 10000000;
o.func = function() { /*Do something that does not involve o.var*/ };

function p() { }
p.prototype.var = 100000;
p.prototype.func = function () { /*Do something that does not involve p.var*/ };

...そして、次のいずれかを実行しました。

var div = document.getElementByID('div');
div.onclick = o.func;

var instance_of_p = new p();
var div = document.getElementByID('div');
div.onclick = instance_of_p.func;

func() を DOM イベント ハンドラーに割り当てると、オブジェクト全体が GC によって収集されなくなりますか?

4

1 に答える 1

0

はい。JavaScript で gc がどのように機能するかについて、この優れた回答をお読みください。あなたの場合、oグローバルまたはクロージャースコープで引き続き利用できるため、収集されません。使用されない可能性がありますが、関数では引き続き使用できます。

ところで:循環参照に問題はありません

于 2012-05-24T19:15:23.817 に答える