闭包是函数定义时绑定外部变量且外层作用域未销毁所形成的机制。它源于词法作用域,需满足三条件:存在内部函数、引用外部局部变量、内部函数被返回或传出;用于私有状态、循环绑定、缓存等,但需防内存泄漏。

闭包思维导图不是罗列概念,而是呈现“定义—机制—表现—用途—风险”这条逻辑线。重点落在它为什么能记住外层变量、什么时候形成、怎么被实际用起来。
从词法作用域切入画根节点
最顶层写“词法作用域:函数的作用域由定义位置决定,而非调用位置”。这是闭包的起点,不是附加说明。下面直接连出两个分支:
- “定义时绑定外部变量” → 引出自由变量(free variable)概念
- “执行后外层作用域未销毁” → 指向闭包形成的内存前提
标注闭包形成的三个必要条件
在中间层清晰列出触发闭包的硬性条件,每条配简短代码示意:
使用约定式提交(Conventional Commits)生成标准化的 Git 提交信息。适用于以下场景: (1) 暂存更改时需要提交信息; (2) 审查 diff 时希望获得结构化摘要; (3) 编写 PR 描述或变更日志(changelog)条目; (4) 用户明确要求“为本次更改编写提交信息”。 该功能会分析已暂存/未暂存的 diff,并生成按类型(type)划分范围的提交信息。
- 存在内部函数(如
function inner() { ... }) - 内部函数引用了外部函数的局部变量(如访问
count) - 内部函数被返回或传递到外部作用域(如
return inner或setTimeout(inner, 100))
分左右两区展示典型场景与陷阱
右侧列常用价值点,左侧对应标出易错细节:
- 模块私有状态 → 注意:多次调用外层函数会生成多个独立闭包,互不干扰
- 防变量污染的循环绑定 → 对比 var / let 在 for 循环中产生的不同闭包行为
- 缓存/计数器/配置封装 → 提醒:若引用全局对象或 DOM 节点,可能引发内存泄漏
底层机制单列一栏强调执行上下文生命周期
用箭头图示意:外层函数执行完 → 执行上下文本该出栈 → 但因内部函数仍持有对其变量对象的引用 → GC 不回收 → 形成闭包环境。这里可加注:“不是函数记住了变量,而是变量对象因被引用而继续存活”。

















