You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript执行点击事件时出现内存泄漏、内存不释放的原因是什么?

核心问题解答

你对作用域变量回收的基础理解是正确的:函数执行结束后,没有外部引用指向的内部变量都会被标记为可回收,出现你观察到的现象是以下几个原因导致的:

  • JS垃圾回收本身是非即时的:浏览器JS引擎普遍采用标记清除的垃圾回收策略,只会在内存占用达到特定阈值、进程进入空闲状态等时机才会执行回收操作,不会在函数作用域销毁的瞬间就清理无用内存。你看到的1~2分钟后内存回落,就是GC触发后的正常表现,不属于内存泄漏。
  • 浏览器图片缓存会占用固定内存:每次插入图片节点时,浏览器会完成资源请求、解码、渲染的完整流程,哪怕你后续删除了DOM中的img节点,浏览器为了优化后续加载速度,依然会保留图片的缓存副本,这部分内存不受JS GC管控,所以内存永远不会回落至完全的初始值,只要不会出现无限制的持续增长,就属于正常情况。
  • 你的代码存在低级笔误:bth.addEventListener应为btn.addEventListener,否则事件绑定失败,功能无法正常运行。

优化方案

如果要降低内存波动,可以修改逻辑避免反复创建删除DOM节点:

const btn = document.getElementById('btn');
let img = null;

btn.addEventListener('click', () => {
    if (!img) {
        img = document.createElement('img');
        img.id = 'img';
        img.src = './img.jpg';
        img.alt = 'Image';
        btn.after(img);
    } else {
        // 直接切换显示状态,无需删除节点,内存更稳定
        img.hidden = !img.hidden;
    }
});

如果业务要求必须完全删除节点,可在移除前主动清空src引用,加快资源释放速度:

else {
    img.src = '';
    img.remove();
    img = null;
}

内容的提问来源于stack exchange,提问作者Grizzly

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 22:57:01