闭包通过作用域隔离避免全局命名冲突,IIFE封装私有状态、工厂函数创建独立生成器、模块导出单例实例,且严禁挂载全局或暴露可写属性。

闭包能从根本上避免全局命名空间冲突,关键在于它把变量和函数“锁”在自己的作用域里,不往全局(比如 window 或模块顶层)扔任何东西,只暴露真正需要的接口。
用立即执行函数封装私有状态
把一组相关逻辑包进一个 IIFE(立即执行函数表达式),内部变量对外不可见,只返回必要方法:
- 写法示例:
const counter = (function() { let count = 0; return { next: () => ++count, reset: () => count = 0 }; })(); -
count完全私有,外部无法直接读写,只能通过next()或reset()操作 - 即使多个模块各自定义这样的
counter,彼此互不影响——每个 IIFE 都创建独立作用域
工厂函数生成隔离的 ID 生成器
需要多个不同规则的序列时(比如用户 ID 每次 +1、订单号每次 +10),用工厂函数配合闭包:
用于 inference.sh 的 JavaScript/TypeScript SDK,可运行 AI 应用、构建代理、集成 150+ 模型。包名:@inferencesh/sdk(npm install),完整 TypeScript 支持。
- 定义:
function createIdGenerator(start = 0, step = 1) { let id = start - step; return () => (id += step); } - 调用:
const userId = createIdGenerator(1001, 1); const orderId = createIdGenerator(10000, 10); - 两个生成器完全独立,
userId()和orderId()不会互相干扰,也不污染全局
模块文件中导出单例实例而非工厂
整个项目只需一套统一编号(如通用 ID),就在模块里直接执行并导出结果函数:
- 在
id.js中:export const nextId = (() => { let id = 0; return () => ++id; })(); - 其他文件统一导入:
import { nextId } from './id.js'; - 所有地方调用的都是同一个闭包实例,保证全局唯一、连续、无重复
- 比到处调用
createIdGenerator()更安全,杜绝多处初始化导致的序列错乱
避免挂载到全局对象或随意暴露属性
不要为了“方便”把东西塞进 window 或导出带可写字段的对象:
- ❌ 错误:
window.nextId = 0; export const idUtils = { next() { return ++window.nextId; } }; - ✅ 正确:只导出纯函数,如
export const nextId = () => { /* 闭包内自增 */ }; - 可写属性(如
idUtils.step = 5)等于打开后门,破坏封装性和确定性

















