var theThing = null;
var replaceThing = function() {
var priorThing = theThing; // hold on to the prior thing
var unused = function() {
// 'unused' is the only place where 'priorThing' is referenced,
// but 'unused' never gets invoked
if (priorThing) {
console.log("hi");
}
};
theThing = {
longStr: new Array(1000000).join('*'), // create a 1MB object
someMethod: function() {
console.log(someMessage);
}
};
};
からのコードのこの作品に出会った
私は、コンソールにこのコードを入力するとreplaceThing()
を複数回呼び出して、真の十分な試みたが、 Chromeタスクマネージャのメモリ使用量はGC後も上がります。
クロージャunused
は、priorThingへの参照を保持しているため、GCに適格ではありません。しかし:
priorThing = theThing
が実行される
- は、
unused
クロージャ内の参照は、theThing
にも変化しないのですか? - #1が当てはまらない場合でも、の実行が終了すると、変数
unused
はスコープから外れてはなりませんか?
theThing
古くないことをいいます。私の理解は正しいのですか?theThingのsomeMethodクロージャが作成されると、未使用の参照が保持され、それ自体がpriorThingへの参照を保持します。 priorThing自体はsomeMethodの前のバージョンを含んでおり、未使用の前のバージョンには、最初のオブジェクトへの参照チェーンを形成していますか? –yah that right understand – henrybbosa
JavaScriptの厄介な部分 – henrybbosa