闭包在接口版本化中通过工厂函数为每个版本创建隔离实例,版本在初始化时固化且不可变,支持多版本共存与按需路由,需主动管理生命周期并严格控制接口暴露边界。

闭包在接口版本化中的应用,关键在于把版本差异“固化”到每个模块实例里,而不是让一个接口对象动态切换版本。它不靠运行时打标签或改属性,而是靠工厂函数每次生成专属闭包,让 v1、v2、v3 成为彼此隔离的独立实体。
版本由创建决定,不可中途修改
闭包一旦形成,内部变量和逻辑就固定了。所以版本必须在初始化时明确,不能像 api.version = 'v2' 这样后期赋值。
- 工厂函数接收 version 参数(如字符串
'v1'或配置对象) - 该参数直接参与初始化:加载对应 schema、选择鉴权策略、读取专属 timeout 或重试次数
- 每次调用都产出全新闭包,
apiV1和apiV2的缓存、定时器、状态互不影响
多版本共存,按需路由调用
业务不需要强制统一版本,而是根据上下文灵活选用已创建的闭包实例。
- 路径前缀识别:
/v2/user→ 调用apiV2.request() - 请求头识别:
X-API-Version: v2→ 查versionMap.get('v2')获取对应实例 - 租户配置驱动:
tenant.apiVersion === 'v2' ? apiV2 : apiV1 - 实例可复用、可缓存,避免重复创建开销
生命周期需主动管理
闭包不会自动释放,热更新或降级时旧版本资源必须显式清理。
- 提供
dispose()方法:清除定时器、取消监听、关闭 WebSocket - 新版本通过
accept()或重新调用工厂函数初始化 - 用
Map或WeakMap管理实例,按 key(如'v2-tenant-a')精准卸载,不污染全局
接口暴露要守住边界
返回的对象只暴露安全方法,绝不泄露内部状态引用。
- 不返回原始缓存对象:
return { cache }❌;应只提供getCacheSize()✅ - 所有入参经私有校验函数处理,如
_validateUrl()、_sanitizeHeaders() - loading/error 等中间状态藏在闭包内,外部只能通过
onProgress(cb)或isPending()间接感知











