JavaScript中闭包是如何形成内存泄漏的【教程】

陌墨同学_2224

陌墨同学_2224

2026-01-22

198人浏览

原创

闭包本身不会导致内存泄漏,真正原因是意外保留对大对象的引用;当闭包捕获大数组、DOM节点等并被全局变量、事件监听器、定时器等长期持有时,其引用的外部变量无法被垃圾回收,造成内存泄漏。

javascript中闭包是如何形成内存泄漏的【教程】

JavaScript 中闭包本身不会导致内存泄漏,真正的问题是「意外保留对大对象的引用」,且该引用本该被释放却一直存活。

闭包持有对外部作用域变量的强引用

只要内部函数还存在(比如被挂到全局、绑定到事件、存进定时器或缓存中),它所形成的闭包就会阻止外部函数作用域中所有变量被垃圾回收——哪怕其中只有一个是大数组或 DOM 节点。

  • function createHandler(data) { return function() { console.log(data); }; }:如果 data 是一个几 MB 的 JSON 解析结果,而返回的函数被赋值给全局变量或长期监听的事件处理器,data 就无法释放
  • 常见于 React 类组件中将箭头函数作为事件处理函数绑定在实例上,同时又在函数中访问了 this.state 或 this.bigData
  • V8 的“上下文隔离”机制会让整个词法环境对象保留在内存中,不只是单个变量

DOM 引用 + 闭包是最典型的泄漏组合

当闭包捕获了一个 DOM 元素(或其父节点),而该元素已被从文档中移除,但闭包仍活着,就形成“悬挂引用”,浏览器无法回收这个 DOM 树及其关联的 JS 对象。

Vue工具箱(免费版)
Vue工具箱(免费版)

规避 Vue 3 常见陷阱:响应式、ref 与 reactive、computed 时机与组合式 API 优选实践。

下载
  • const el = document.getElementById('app'); const handler = () => console.log(el.innerHTML); el.addEventListener('click', handler);:即使后续调用 el.remove(),只要 handler 还挂在事件系统里,el 就不会被回收
  • 更隐蔽的是通过 setTimeout 或 setInterval 持有对 DOM 的引用,比如 setInterval(() => el.style.color = 'red', 100)
  • 现代框架(如 Vue/React)通常会在组件卸载时自动清理事件监听器,但手动添加且未显式 removeEventListener 的情况依然高发

如何检测和验证闭包引起的泄漏

不能只看代码逻辑,要借助 DevTools 的 Memory 面板做实证分析。

  • 在 Chrome DevTools 中录制一次「Allocation instrumentation on timeline」,触发疑似泄漏的操作(如打开/关闭弹窗多次),观察是否持续增长 Closure 和 HTMLDivElement 等构造器实例数
  • 使用 console.memory 打印堆大小变化,配合强制 GC(gc(),需开启 --js-flags="--expose-gc")对比前后差值
  • 在 Heap Snapshot 中筛选 Closure,按“Retained Size”排序,点开看 “Retainers” 链路,确认是否通过全局变量、定时器、事件监听器等路径间接持有了大对象

最易被忽略的是:闭包泄漏往往不表现为立即崩溃或卡顿,而是长时间运行后堆内存缓慢上涨、GC 频次升高、最终触发浏览器限制。排查时别只盯着函数定义,重点查「谁还拿着这个函数」以及「它闭包里到底关着什么」。

Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

2023.08.07

2355

5

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.23

3882

1

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

2023.10.13

1296

3

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

2025.09.10

4499

7

chrome什么意思
chrome什么意思

chrome是浏览器的意思,由Google开发的网络浏览器,它在2008年首次发布,并迅速成为全球最受欢迎的浏览器之一。本专题为大家提供chrome相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

3006

5

chrome无法加载插件怎么办
chrome无法加载插件怎么办

chrome无法加载插件可以通过检查插件是否已正确安装、禁用和启用插件、清除插件缓存、更新浏览器和插件、检查网络连接和尝试在隐身模式下加载插件方法解决。更多关于chrome相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.06

6279

7

Chrome开启无痕模式
Chrome开启无痕模式

本专题整合了Chrome无痕模式开启相关内容,阅读专题下面的文章了解更多详细教程。

2026.03.24

4487

22

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

2023.09.20

2478

7

全局变量怎么定义
全局变量怎么定义

本专题整合了全局变量相关内容,阅读专题下面的文章了解更多详细内容。

2025.09.18

5385

12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
uni-app快速上手
uni-app快速上手

共0课时 | 0人学习

Vue 教程
Vue 教程

共42课时 | 17.6万人学习

Vue3.x 工具篇--十天技能课堂
Vue3.x 工具篇--十天技能课堂

共26课时 | 2.6万人学习