闭包可实现日志自动拼接前缀,核心是外层函数接收prefix并返回记住该值的内层函数;支持动态时间戳、多前缀复用及模块化隔离,但需避免循环中闭包引用共享问题。

闭包可以轻松实现日志输出时自动拼接前缀,核心思路是:用外层函数接收前缀字符串,返回一个内层函数(即日志函数),该内层函数“记住”了外层作用域的前缀,并在每次调用时将其与传入的日志内容拼接输出。
用闭包封装带前缀的日志函数
定义一个工厂函数,接收 prefix 参数,返回一个绑定了该前缀的 console.log 封装函数:
function createLogger(prefix) {
return function(...args) {
console.log(`[${prefix}]`, ...args);
};
}
<p>const apiLogger = createLogger('API');
const dbLogger = createLogger('DB');</p><p>apiLogger('请求开始', '/users'); // [API] 请求开始 /users
dbLogger('查询完成', 'SELECT <em> FROM users'); // [DB] 查询完成 SELECT </em> FROM users
</p>这里 createLogger 执行后返回的函数形成了闭包,内部保留了对 prefix 的引用,后续每次调用都无需重复传入前缀。
支持动态时间戳和格式增强
可在闭包中加入更多上下文信息,比如自动添加当前时间、调用位置等:
function createRichLogger(prefix) {
return function(...args) {
const time = new Date().toISOString().slice(11, 23);
const msg = args.map(a => typeof a === 'object' ? JSON.stringify(a) : a).join(' ');
console.log(`[${time}] [${prefix}]`, msg);
};
}
<p>const userLogger = createRichLogger('USER');
userLogger('登录成功', { id: 101, name: 'Alice' });
// [14:22:35.123] [USER] 登录成功 {"id":101,"name":"Alice"}
</p>多个前缀复用同一套逻辑
闭包让前缀“固化”在每个日志实例中,不同前缀互不干扰,适合模块化场景:
- 每个模块调用一次 createLogger 得到专属 logger,避免全局污染
- 前缀可为模块名、服务名、环境标识(如 'DEV' / 'PROD')
- 结合环境变量或配置,实现不同环境输出不同前缀
注意事项
闭包本身不产生副作用,但要注意:
- 不要在循环中直接创建闭包并赋值给变量(常见坑:所有函数共享同一个 prefix 引用),应确保每次调用 createLogger 都是独立执行
- 若需修改前缀,应重新调用工厂函数,而非试图修改闭包内部变量(闭包变量通常不可外部访问)
- 生产环境建议用更健壮的日志库(如 winston、pino),但闭包方案足够满足轻量调试需求
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











