WeakMap缓存DOM元素后内存没释放是怎么回事?
在开发可复用组件时,用WeakMap缓存DOM元素的处理函数,但发现页面卸载后内存没释放,这是为什么?
我这样写的:
const handlers = new WeakMap();
function mount(element) {
const handler = () => {/* 耗内存操作 */};
handlers.set(element, handler);
element.addEventListener('click', handler);
}
测试时移除了DOM元素,但通过内存快照看到handler函数还在。明明WeakMap的键是DOM元素,应该被自动回收才对啊…
WeakMap的键是弱引用,但element.addEventListener会创建一个强引用,导致element和handler都无法被垃圾回收。解决方法很简单,在组件卸载时手动移除事件监听器:
这样就能正确释放内存了。记住,
WeakMap只是对键做弱引用,但它不会帮你处理其他地方的强引用,比如事件监听器这种典型的场景。前端内存管理有时候就是这么麻烦,得自己多留意这些坑。