闭包是函数表达式实现私有数据封装的核心机制,通过捕获外层作用域变量并维持引用,使私有变量仅能被闭包内函数访问;IIFE、构造函数与模块模式分别适用于单例、多实例及可维护模块场景。

函数表达式本身不直接“处理”私有数据,而是通过闭包机制捕获并维持对所在作用域中变量的访问权,从而实现对私有数据的封装与受控访问。
闭包是核心载体
只要函数表达式定义在某个作用域内,且内部引用了该作用域的变量,它就形成了闭包。这个闭包会持续持有对外部变量的引用,即使外层函数已执行完毕,变量也不会被回收。
- 私有变量只能在定义它的函数作用域中声明(如 let、const 或 var)
- 函数表达式(包括箭头函数、匿名或命名函数)作为闭包,能读写这些变量
- 外部代码无法直接访问这些变量,只能通过暴露出去的方法间接操作
IIFE 封装单例私有状态
立即执行函数表达式(IIFE)是最简洁的私有数据封装方式,适合创建单例对象或工具模块。
- 将私有变量和函数放在 IIFE 内部,避免污染全局或对象属性
- 返回一个对象,其方法因闭包关系可访问私有数据
- 每次调用 IIFE 都生成独立作用域,但通常只执行一次,形成唯一实例
const counter = (function() {<br> let count = 0;<br> return {<br> increment: () => count++,<br> value: () => count<br> };<br>})();
构造函数中结合函数表达式模拟实例级私有字段
每个新实例都拥有自己的一套私有变量,互不影响,适用于需要多个隔离状态的对象。
- 在构造函数体内用 const 或 let 声明变量
- 用函数表达式定义方法并赋值给 this,使其成为特权方法
- 这些方法因闭包绑定当前实例的私有变量,而非共享原型上的方法
function Person(name) {<br> const _name = name;<br> this.getName = function() { return _name; };<br> this.setName = function(value) { _name = value; };<br>}
模块模式增强可维护性
具名函数表达式替代匿名 IIFE,提升调试体验和代码可读性;配合明确的返回结构,便于扩展与测试。
- 用命名函数包裹私有逻辑,函数名可在开发者工具中显示
- 返回对象统一管理公有接口,清晰区分内外职责
- 适合构建功能完整、需长期维护的模块(如配置管理器、状态容器)

















