【发布时间】:2021-07-29 11:51:18
【问题描述】:
我正在构建一个队列,如果没有对该队列实例的引用,我想避免执行任何任务。
我用WeakRef 尝试了一些东西,但可能永远不会成功。
const queue = () => {
const enqueue = () => {
console.log("enqueue");
setTimeout(() => {
if (instanceRef.deref()) {
console.log("the queue is still referenced so perform task");
}
});
};
const instance = { enqueue };
const instanceRef = new WeakRef(instance);
return instance;
};
b = queue();
b.enqueue();
b = null;
console.log("b is set to null so there are no references to the instance");
如果队列仍然存在但不太优雅,则另一种方法是检查任务。
【问题讨论】:
-
“可能永远不会工作” - 为什么不呢?当然,这种方法会奏效,您永远不会等待足够长的时间让
instance真正被垃圾收集。 -
好吧,我猜永远不会可靠地工作。你预计要等多久?我等了 1 分钟仍然被引用。
-
如果它决定被垃圾收集......例如现在,调试器可能仍然在闭包内使用
instanceref,即使它没有在函数内部使用关闭。 -
如果您在超时发生前进入开发工具 Memory 面板并单击 Collect Garbage 按钮,您的代码实际上可以正常工作。如果你想让它自己发生,你需要给引擎施加一些内存压力。除非你给它一个理由,否则垃圾收集器不会回收内存——仅仅等待是不够的。即便如此,您的代码也绝不能依赖于被垃圾收集的东西。如果您希望任务执行具有确定性,则需要自己进行引用计数。
-
非常感谢Bergi!
标签: javascript weak-references