函数表达式模块暴露的核心是利用函数作用域封装逻辑,通过返回值或赋值控制对外接口,无需export语法,支持私有状态、动态判断与跨环境兼容。

函数表达式进行模块暴露,核心在于用函数作用域封装逻辑,再通过返回值或赋值操作决定对外接口。它不依赖 export 语法,而是靠运行时行为控制“暴露什么、何时暴露、怎么暴露”,特别适合需要私有状态、动态判断或跨环境兼容的场景。
用 IIFE 封装并返回公共接口
立即执行函数表达式(IIFE)是最典型的用法:创建独立作用域,内部变量天然私有,只把想暴露的方法挂到返回对象上。
- 写法示例:(function() { let count = 0; return { increment() { return ++count; }, getCount() { return count; } }; })();
- 返回的对象就是模块对外的全部能力,count 不会泄漏,也无法被外部直接修改
- 适合工具类、计数器、配置管理等需要隐藏内部状态的模块
赋值给 module.exports 或 exports 实现 CommonJS 暴露
在 Node.js 的 CommonJS 环境中,函数表达式可直接作为导出值,灵活且轻量。
- 导出单个函数:module.exports = function greet(name) { return `Hello, ${name}`; };
- 挂载为属性:exports.helper = function() { /* ... */ };(注意不能重写 exports 本身)
- 比命名函数声明更易压缩、更适合构建工具链中的适配层或 polyfill 代理
支持运行时条件导出
静态 `export` 是编译时确定的,而函数表达式可在加载时根据环境、配置或参数决定暴露内容。
- 比如按 NODE_ENV 决定是否暴露调试方法:const api = { fetch: ..., ...(process.env.NODE_ENV === 'dev' ? { logDebug: ... } : {}) };
- 适用于插件系统、A/B 测试模块、多版本 SDK 兼容层
- 避免打包进无用代码,提升最终产物体积控制精度
作为高阶函数工厂导出定制化实例
函数表达式本身可作为模块默认导出,接收参数后生成带上下文的新接口,比静态对象更灵活。
- 常见于请求客户端:export default function createClient(baseURL) { return { get(url) { /* 使用 baseURL */ } }; }
- 调用方:const api = createClient('https://api.example.com');
- 每个实例拥有独立闭包环境,互不干扰,利于多租户或微前端场景











