问题描述
个人理解:如果引用闭包变量的对象都解除引用,那么闭包会被垃圾回收。查阅的解除引用的方法是将其设置成null,但是实际使用确并未解除。
复现代码
npx ts-node index.ts
// index.ts
const CreateDiv = (() => {
let instance: CreateDiv;
class CreateDiv {
html: string = "";
constructor(html: string) {
if (instance) {
return instance;
}
this.html = html;
return instance = this;
}
getName() {
console.log(this.html);
}
}
return CreateDiv;
})();
let a: any = new CreateDiv("sven1");
let b: any = new CreateDiv("sven2");
console.log(a === b);
a.getName(); // sven1
b.getName(); // sven1
a = null;
b = null;
setTimeout(() => {
b = new CreateDiv("sven2");
a = new CreateDiv("sven1");
a.getName(); // sven1
b.getName(); // sven1
}, 1000);
export {};
预期结果
在解除对闭包instance的引用后,再次创建闭包应该为sven2,可是实际上还是sven1,并没有对闭包变量进行回收
> sven1
> sven1
> sven2
> sven2
实际结果
未被回收
> sven1
> sven1
> sven1
> sven1
系统环境
$ uname -a
> Linux codespaces-b61014 6.5.0-1022-azure #23~22.04.1-Ubuntu SMP Thu May 9 17:59:24 UTC 2024 x86_64 x86_64 x86_64 GNU/Linux
$ node -v
> v20.15.1
$ npm -v
> 10.7.0
$ npm list
> js_design_models@ /workspaces/js_design_models
├── ts-node@10.9.2
└── typescript@5.5.3