函数表达式通过作用域和闭包实现私有状态:参数与const/let声明的局部变量构成私有字段,返回对象的方法作为闭包受控访问,确保实例隔离与数据安全。

函数表达式定义私有状态的核心是利用 JavaScript 的作用域和闭包机制:把变量声明在函数内部,不暴露到外部作用域,再通过返回的对象方法间接访问这些变量。
用参数和局部变量创建私有字段
函数表达式接收初始化参数,并在内部用 const 或 let 声明变量,这些变量就天然成为私有状态,外部无法直接读写。
-
只读私有字段:用
const声明,比如const _id = Date.now(),确保不可篡改 -
可变私有字段:用
let声明,如let _balance = initialBalance,配合 getter/setter 控制修改逻辑 - 多个字段可并列定义,互不干扰,每个调用生成独立的作用域,实例间状态隔离
返回对象提供受控访问接口
返回的对象里只包含方法(不返回原始变量),这些方法作为闭包能持续访问内部私有变量,但外部只能通过它们交互。
- getter 方法(如
getName())返回当前值,不暴露变量名 - setter 方法(如
setAge())可加入校验逻辑,比如拒绝负数年龄 - 行为方法(如
introduce())可组合多个私有字段,对外隐藏内部结构
避免常见陷阱
私有状态不是靠命名约定(如下划线前缀)实现的,而是靠作用域封闭。即使返回的对象属性名带下划线,只要没在返回对象中暴露该变量,它就真正私有。
- 不要在返回对象中直接返回私有变量引用,否则可能被意外修改
- 不要在外部作用域重新赋值函数表达式本身,否则会丢失原有闭包环境
- 注意不要误将私有变量写成全局变量(漏写
let/const),那就不私有了
对比构造函数模式的优势
函数表达式方式天然规避了构造函数模式中“每个实例重复创建方法”的问题——虽然方法每次都会新建,但逻辑简洁、意图明确;若需复用方法,可结合模块模式或原型链优化,但对多数场景,直接返回闭包方法更直观可靠。











