JS训练营入学考题:checkerLogger闭包实现错误排查
代码问题分析
你的代码存在4处核心逻辑错误:
- 计数更新时机错误:传入参数调用返回函数时,执行回调得到结果后直接返回,没有更新cache中的计数,导致统计数据永远不会累加对应结果的次数
- 参数判断逻辑错误:使用
if (arg)判断是否传入参数,只要传入的参数是0、空字符串、null等假值就会被误判为未传参,正确判断应该校验调用时的参数数量 - 未传参时错误执行回调:无参数调用时不需要执行传入的回调函数,你的代码仍然执行了
cb(arg),还会把cb(undefined)的返回值错误计入统计 - 缓存初始化不完整:初始cache为空对象,没有提前设置
true: 0和false: 0的初始值,导致首次返回统计结果时只会存在被访问过的键
修正后代码
function checkerLogger (cb) { // 初始化统计对象,提前设置两个布尔值的初始计数 const cache = { true: 0, false: 0 }; return function (...args) { // 判断是否传入了参数 if (args.length > 0) { // 执行回调得到结果 const result = cb(args[0]); // 更新计数 cache[result] += 1; // 返回结果 return result; } // 无参数直接返回统计结果 return cache; } } // 测试代码 const isOdd = num => num % 2 === 1; const oddCounter = checkerLogger(isOdd); console.log(oddCounter()); //-> { true: 0, false: 0 } console.log(oddCounter(3)); //-> true console.log(oddCounter(2)); //-> false console.log(oddCounter()); //-> { true: 1, false: 1 }
运行上述代码可以完全匹配题目给出的预期输出。
内容的提问来源于stack exchange,提问作者EagerCodier
相关产品推荐
相关产品推荐

