JavaScript中通过闭包实现信息隐藏,核心是利用函数作用域限制变量访问权限,让外部无法直接读写内部变量,只暴露可控接口;私有数据定义在函数内不返回、不挂载,仅通过返回的闭包函数间接操作,每个实例拥有独立作用域,互不干扰。

JavaScript 中通过闭包实现信息隐藏,核心是利用函数作用域限制变量访问权限,让外部无法直接读写内部变量,只暴露可控的接口。
用闭包封装私有数据
把需要隐藏的状态(如属性值)定义在函数内部,不返回、不挂载到对象上,仅通过返回的函数间接操作它。
- 外部代码无法通过点号或方括号访问这些变量,因为它们不在对象属性中,也不在全局或外层作用域里
- 返回的对象方法能访问这些变量,是因为它们形成了闭包,保留了对词法环境的引用
- 每个实例都有独立的作用域,互不干扰,类似类的多个实例拥有各自的私有字段
构造一个带私有属性和公有方法的对象
常见写法是工厂函数:调用一次返回一个新对象,其方法共享同一份私有变量。
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
function createCounter() {
let count = 0; // 私有变量,外部不可访问
<p>return {
increment() { count++; },
decrement() { count--; },
getValue() { return count; }
};
}</p><p>const counter1 = createCounter();
counter1.increment();
console.log(counter1.getValue()); // 1
// counter1.count === undefined (无法直接访问)</p>模拟私有方法和受控访问
除了私有数据,还能封装私有逻辑——比如校验、计算步骤等,只供公有方法内部调用。
立即学习“Java免费学习笔记(深入)”;
- 私有函数同样定义在闭包内,不暴露给外部
- 公有方法可调用它,但用户不能绕过业务规则直接修改状态
- 例如:设置值前强制验证范围,或读取时自动格式化
注意与 class + # 私有字段的区别
ES2022 引入了类私有字段(#field),语法更接近传统 OOP;而闭包方式更灵活、兼容性更好,且天然支持“模块级私有”而非仅实例级。
- 闭包方式私有变量生命周期由引用关系决定,只要还有函数引用它,就不会被回收
- class 私有字段只能在类内部访问,但必须依附于 class 实例,不能用于纯函数式封装
- 两者不是替代关系,而是适用场景不同:闭包适合轻量、函数优先的设计;class 适合结构清晰、需继承或装饰器的场景


















