日志包装器用...args透传参数并增强日志信息:自动注入时间、层级、上下文,兼容同步/异步函数,保留返回值语义与this绑定,支持配置化且无副作用。

用剩余参数(...args)写日志包装器,核心是不改变原函数调用方式,又能自动注入时间、层级、上下文等信息——关键在于“透传”和“增强”并存。
用 ...args 无缝捕获任意参数
剩余参数让包装器能接收任意数量、任意类型的参数,且保持原有顺序和类型,避免手动处理 arguments 对象的繁琐和类型丢失问题。
例如:
function logWrapper(fn, prefix = '') {return function(...args) {
const time = new Date().toISOString().slice(11, 23);
console.log(`[${time}] ${prefix}:`, ...args);
return fn.apply(this, args);
};
}
支持异步函数与返回值透传
真实场景中,被包装函数可能是同步或异步的。包装器应统一处理返回值,并保留 Promise 链或原始值语义。
- 同步函数:直接返回
fn(...args) - 异步函数:用
async/await捕获结果或错误,再打印 - 推荐统一用
async包装,内部判断是否为 Promise,避免分支逻辑泄漏到调用侧
添加上下文与可选元数据
除了时间戳,常需模块名、操作 ID、用户 ID 等。可用闭包或额外参数注入,不侵入原函数签名:
const apiLogger = logWrapper(fetch, 'API');const userLogger = logWrapper(console.log, `USER-${userId}`);
也可扩展为高阶工厂函数,支持配置 level(info/warn/error)、是否启用、输出目标(console / custom handler)等。
避免副作用与性能干扰
日志本身不该影响主逻辑执行,尤其不能吞掉错误或改变 this 绑定:
- 始终用
fn.apply(this, args)或fn.call(this, ...args)保证 this 正确 - 错误要 re-throw,或在 log 后显式 throw,不可静默忽略
- 生产环境可通过开关关闭日志,但函数签名和行为保持不变
不复杂但容易忽略。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











