不解除事件监听会导致内存泄漏,尤其dom元素移除后监听函数及闭包变量无法被gc回收;应避免匿名函数绑定,优先用具名函数或abortcontroller自动清理,全局事件和框架外手动绑定需显式解绑。

addEventListener 不解绑就会泄漏
DOM 元素绑定事件后没调用 removeEventListener,又把元素从 DOM 中移除(比如 innerHTML = ''、remove() 或 Vue/React 组件卸载),监听函数和闭包引用的外部变量就可能无法被 GC 回收——尤其当监听函数是闭包或用了箭头函数时。
典型表现:页面反复打开关闭同一模块,内存占用持续上升;DevTools 的 Memory 面板中看到 detached DOM 节点数不归零。
- 避免在循环里用匿名函数绑定:
el.addEventListener('click', () => {...})→ 后续无法removeEventListener - 优先用具名函数或保存引用:
const handler = () => {...}; el.addEventListener('click', handler); ... el.removeEventListener('click', handler); - Vue 3 的
onMounted/onUnmounted、React 的useEffect清理函数,必须显式调用removeEventListener
使用 AbortController 解耦事件监听生命周期
现代方案是用 AbortController 控制事件监听器的自动清理,比手动配对 addEventListener/removeEventListener 更可靠,尤其适合异步场景或动态组件。
文章转信息图。将文章/笔记转化为手机可读的 HTML 信息图,自动匹配视觉风格。触发场景:文章转图、笔记转图、信息图、转小红书图、做张图、可视化这篇文章、文生图。
原理:将 signal 传给 addEventListener 的 options,当调用 controller.abort() 时,浏览器自动移除所有带该 signal 的监听器。
- 支持的事件类型:所有标准 DOM 事件(
click、scroll、input等) - 注意兼容性:
AbortSignal在 IE 完全不支持,Edge 79+、Chrome 88+、Firefox 79+ 支持 - 示例:
const controller = new AbortController();<br>element.addEventListener('click', handler, { signal: controller.signal });<br>// 后续只需 controller.abort(),无需记住 handler 引用
全局事件(window/document)最容易漏清理
绑定在 window 或 document 上的事件监听器,生命周期往往超出单个组件,是最常见的泄漏源头。比如监听页面 resize、keydown、scroll,但组件销毁时没清理。
- React 中不要在
useEffect里只写addEventListener,必须返回清理函数:useEffect(() => {<br> const handleResize = () => {};<br> window.addEventListener('resize', handleResize);<br> return () => window.removeEventListener('resize', handleResize);<br>}); - Vue 2 的
beforeDestroy、Vue 3 的onBeforeUnmount同理,不能只绑不拆 - 如果监听器逻辑复杂,考虑用事件委托 + 动态 class 判断,而非直接绑定到 document
框架内事件绑定不是“自动安全”的
React 的 onClick、Vue 的 @click 看似不用手动管理,但仅限于模板内声明的原生事件。一旦你用 ref 拿到 DOM 节点并手动 addEventListener,就回到原生泄漏风险中。
- Vue 3 的
v-click-outside自定义指令,内部若没用onBeforeUnmount清理,照样泄漏 - React 中通过
useRef+useEffect绑定事件,清理逻辑写错(比如忘了 return 函数、或 return 了空函数)等于没清 - 第三方库如
chart.js、mapbox-gl的事件绑定,文档常不强调清理方式,需查源码或实例的destroy/off方法
AbortController 却在错误时机调用 abort(),或者清理函数执行时 DOM 节点已不存在导致报错进而中断清理流程。这些边界情况得靠 Memory 面板 + 录制 Allocation instrumentation on timeline 来验证。前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










