闭包使内部函数持续引用外部变量,使其在外部函数执行后仍保留在内存中,实现私有变量封装;典型模式是工厂函数返回访问私有变量的对象或函数,多个闭包可共享同一变量,需避免循环中var导致的闭包陷阱。

闭包通过让内部函数持续引用外部函数的变量,使这些变量在外部函数执行完毕后仍保留在内存中,从而实现“私有变量”的保存。
闭包形成的关键:内部函数引用外部变量
当一个函数返回另一个函数,且返回的函数访问了外层函数的局部变量时,JavaScript 引擎会为该变量创建一个闭包环境。这个变量不会被垃圾回收,即使外层函数已经执行结束。
- 局部变量生命周期本应随函数执行结束而销毁
- 但若被内部函数“捕获”并持续使用,引擎会延长其存活时间
- 该变量仅能被闭包内的函数访问,外部无法直接读写,形成“私有性”
典型写法:返回一个访问私有变量的函数
最常见也最清晰的闭包模式是工厂函数返回对象或函数,把变量封装在作用域内:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
function createCounter() {
let count = 0; // 私有变量,外部不可访问
return {
increment: () => ++count,
getValue: () => count,
reset: () => { count = 0; }
};
}
const counter = createCounter();
console.log(counter.getValue()); // 0
counter.increment();
console.log(counter.getValue()); // 1
// 无法直接修改 count:counter.count = 100; // 无效
注意:变量是按引用保留,不是拷贝
闭包保留的是变量本身,不是值的快照。多个闭包可以共享同一个私有变量:
- 如果一个外层函数返回多个内部函数,它们都引用同一个变量
- 任一函数修改该变量,其他函数读取时会看到最新值
- 这正是实现计数器、缓存、状态管理的基础
避免常见陷阱:循环中闭包捕获同一变量
在 for 循环中直接创建闭包,容易因变量提升导致所有闭包共享最后一个值:
// ❌ 错误示例:全部输出 5 for (var i = 0; i console.log(i), 100); } // ✅ 正确做法:用 let(块级作用域)或立即执行函数隔离 for (let i = 0; i console.log(i), 100); // 输出 0 1 2 3 4 }
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










