闭包和类的共同点:为什么它们都能“携带状态”

副标题 / 摘要 闭包和类都能“携带状态”,只是表达方式不同。本文用简单示例对比二者的共性与差异。 目标读者 学习函数式与面向对象的开发者 想理解“状态封装”概念的人 需要在不同范式间切换的工程师 背景 / 动机 闭包常被认为是函数式特性,类是面向对象特性。 实际上它们都解决“状态 + 行为绑定”的问题。 核心概念 闭包:函数捕获外部变量形成状态 类/对象:属性 + 方法封装状态 封装:隐藏内部状态细节 实践指南 / 步骤 用闭包实现一个计数器 用类实现同样功能 对比可读性与扩展性 选择更适合的表达方式 可运行示例 # 闭包实现 def make_counter(): x = 0 def inc(): nonlocal x x += 1 return x return inc # 类实现 class Counter: def __init__(self): self.x = 0 def inc(self): self.x += 1 return self.x if __name__ == "__main__": c1 = make_counter() print(c1()) c2 = Counter() print(c2.inc()) 解释与原理 闭包通过捕获变量保存状态,类通过属性保存状态。 二者都把“状态 + 行为”绑定在一起。 ...

2026年1月24日 · 1 分钟 · map[name:Jeanphilo]

JavaScript for 循环闭包陷阱:为什么会打印 3

副标题 / 摘要 for 循环里的闭包经常会打印同一个值。本文解释原因,并给出可运行修复方法。 目标读者 使用 JavaScript 的开发者 需要理解闭包的工程师 前端与全栈团队 背景 / 动机 JavaScript 的函数作用域与闭包容易导致“循环变量捕获”问题。 理解这个陷阱能避免常见 Bug。 核心概念 闭包:函数捕获外部变量 作用域:var 与 let 的区别 事件回调:延迟执行时才读取变量 实践指南 / 步骤 用 let 替代 var 或使用立即执行函数(IIFE) 把循环变量变成函数参数 在回调中避免直接引用 var 变量 可运行示例 <button id="button0">0</button> <button id="button1">1</button> <button id="button2">2</button> <script> function hookupevents() { for (let i = 0; i < 3; i++) { document.getElementById("button" + i) .addEventListener("click", function() { alert(i); }); } } hookupevents(); </script> 解释与原理 使用 var 时,循环结束后 i 的值为 3,闭包读取的是同一个变量。 用 let 会创建块级作用域,每次循环都有独立 i。 ...

2026年1月24日 · 1 分钟 · map[name:Jeanphilo]

什么是闭包:概念、用途与类的相似点

副标题 / 摘要 闭包让函数携带环境,从而实现更灵活的封装与复用。本文解释闭包概念、用途与类的相似点。 目标读者 正在学习函数式编程的开发者 想理解回调与高阶函数的工程师 做语言设计或框架开发的团队 背景 / 动机 闭包经常出现在回调、事件处理与工厂函数中。 如果不了解闭包的捕获规则,很容易出现 bug。 核心概念 闭包:函数 + 外部环境的绑定 自由变量:函数体内引用但不在局部定义的变量 环境捕获:把外部变量打包进函数 实践指南 / 步骤 用闭包封装局部状态 避免捕获易变的循环变量 在回调中谨慎使用闭包 必要时用工厂函数隔离环境 可运行示例 def make_counter(): count = 0 def inc(): nonlocal count count += 1 return count return inc if __name__ == "__main__": c = make_counter() print(c()) print(c()) 解释与原理 闭包是“函数携带环境”。 这让函数具有私有状态,类似类的实例字段。 常见问题与注意事项 闭包会导致内存泄漏吗? 可能,尤其是捕获大对象时。 闭包和类的相似点? 都能封装状态与行为。 闭包与类的区别? 闭包更轻量,类更适合复杂对象。 最佳实践与建议 用闭包封装轻量状态 避免捕获可变共享变量 对复杂对象优先用类 小结 / 结论 闭包是一种轻量级封装机制,能让函数“带着状态走”。 理解闭包是掌握函数式编程的关键。 ...

2026年1月24日 · 1 分钟 · map[name:Jeanphilo]