You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.08 04:06:04