闭包可实现函数运行轨迹记录:外层函数创建私有日志数组,内层函数执行时追加含时间戳、参数、结果/错误、耗时的日志;提供 getcalls() 和 clear() 接口,保障数据隔离且不侵入原逻辑。

闭包可以轻松实现函数运行轨迹的记录,核心思路是:用外层函数创建一个私有状态(如数组),内层函数(被装饰的函数)每次执行时往这个状态里追加日志,同时保持原有逻辑不变。
用闭包封装日志容器
定义一个外层函数,返回一个增强后的函数。该外层函数内部声明一个数组(如 calls),用于存储每次调用的时间、参数、返回值等信息。这个数组被内层函数闭包引用,不会被外部直接访问,保证数据隔离。
- 避免全局变量污染,日志数据随闭包生命周期存在
- 多个被装饰函数可各自拥有独立的轨迹记录
- 适合调试、监控或教学演示函数调用过程
在闭包中拦截并记录函数调用
返回的内层函数应先记录入参(可序列化处理)、打上时间戳,再执行原始函数,捕获返回值或异常,最后把完整条目推入日志数组。
- 记录字段建议包括:timestamp、args、result(或 error)、duration(可选)
- 对参数使用
JSON.stringify或结构化克隆(注意循环引用) - 用
console.time/console.timeEnd或performance.now()测耗时
提供查看和清空轨迹的接口
除了返回增强函数,还可暴露 getCalls() 和 clear() 方法,通过对象形式或额外闭包方法导出,方便调试时主动查询或重置记录。
- 例如:返回
{ fn: enhancedFn, getCalls, clear } - getCalls() 返回日志数组的浅拷贝,防止外部误改内部状态
- clear() 直接清空原数组,不影响已返回的旧日志副本
简单示例:记录 add 函数的每次调用
(以下为示意代码,非可执行片段)
const trackedAdd = trackCall((a, b) => a + b);
trackedAdd(2, 3); // 记录 [ { args: [2,3], result: 5, timestamp: ... } ]
trackedAdd(1, 1); // 追加第二条
console.log(trackedAdd.getCalls());
这种模式不侵入原函数逻辑,零配置即可获得可追溯的执行快照,特别适合开发期快速验证函数行为。











