闭包在模块模式中通过iife创建私有作用域并返回含特权方法的对象来暴露公共接口:私有变量和函数不可直接访问,仅能通过返回对象的方法间接操作,如countermodule.increment()可修改count但countermodule.count为undefined。

闭包在模块模式中暴露公共接口并隐藏实现,核心是利用函数作用域和返回对象的组合:外部无法访问函数内部变量和函数,但可以通过返回对象上的方法间接操作它们。
用立即执行函数(IIFE)创建封闭作用域
把所有私有逻辑写在函数体内,该函数只执行一次,形成独立作用域。这个作用域就像一道墙,隔开外部环境。
- 函数内声明的 let/const 变量 和 普通函数 默认不可被外部访问
- 返回一个对象,对象的每个属性(通常是函数)都构成一个“特权方法”,能访问该作用域内的私有成员
- 返回的对象本身不包含私有数据,只保留对私有变量的引用路径
通过返回对象定义公共接口
返回的对象就是模块对外的“门面”。它不暴露内部细节,只提供明确、可控的操作入口。
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
- 接口方法名应语义清晰,比如
init()、save()、getCount() - 同一个私有变量可被多个公有方法共用,比如
increment()和reset()都操作count - 避免在返回对象中直接暴露私有变量(如
count: count),否则会破坏封装性
典型写法示例
下面是一个标准模块模式结构:
const counterModule = (function() {let count = 0;
function logChange() { console.log('Count is now:', count); }
return {
increment() { count++; logChange(); },
reset() { count = 0; logChange(); },
getValue() { return count; }
};
})();
调用 counterModule.increment() 会更新并打印值,但 counterModule.count 是 undefined,counterModule.logChange 也不存在——私有部分完全不可见。
注意避免常见陷阱
- 不要在返回对象里返回私有函数本身(如
logChange: logChange),这等于把私有逻辑暴露出去 - 不要在公有方法中返回私有对象的引用,否则外部可能意外修改其属性(可考虑深拷贝或只读包装)
- 如果模块需多次实例化,应改用工厂函数而非单例 IIFE,例如
function createCounter() { ... }
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










