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

如何用闭包实现计算历史追踪与按指令输出结果或历史对象?

闭包实现计算历史跟踪的代码修复方案

问题分析

原代码存在几个关键问题,导致无法满足需求:

  • 外层函数saveOutput没有返回内部的someWork函数,使得multBy2AndLog是undefined,根本无法调用
  • 存储计算结果时错误使用了.语法(output.x),这会把属性名固定为字符串"x",而非用传入的参数x作为键,应该改用方括号语法output[x]
  • 调用普通参数时,只打印结果但未返回它,导致console.log(multBy2AndLog(2))会额外输出undefined
  • 没必要把magicWord赋值给outer,直接利用闭包特性访问外层参数即可

修复后的完整代码

function saveOutput(func, magicWord) { 
  const output = {}; 
  // 返回内部函数,让外部能调用它
  return function someWork(x) { 
    if (x !== magicWord) { 
      // 用方括号语法以参数x作为键存储计算结果
      output[x] = func(x); 
      // 返回计算结果,外部调用时能拿到对应值
      return output[x]; 
    } else { 
      // 返回完整的历史对象,方便外部查看所有记录
      return output; 
    } 
  }; 
} 

// 测试用例
const multiplyBy2 = function(num) { 
  return num * 2; 
}; 
const multBy2AndLog = saveOutput(multiplyBy2, 'boo'); 
console.log(multBy2AndLog(2)); // => 输出 4 
console.log(multBy2AndLog(9)); // => 输出 18 
console.log(multBy2AndLog('boo')); // => 输出 { '2': 4, '9': 18 }

修复点说明

  • 返回内部函数:外层函数saveOutput返回someWork,确保multBy2AndLog是一个可调用的函数
  • 正确存储键值对:使用output[x]替代output.x,让每个传入的参数都作为独立键,对应存储计算结果
  • 返回计算结果:传入普通参数时返回func(x)的结果,避免外部调用时出现多余的undefined
  • 简化变量使用:直接利用闭包访问外层的magicWord参数,减少不必要的变量赋值

测试验证

运行上述代码后,控制台会依次输出:

4
18
{ '2': 4, '9': 18 }

完全符合需求:传入普通参数时返回并打印计算结果,传入指定密码boo时返回并打印包含所有历史操作的完整对象。

内容的提问来源于stack exchange,提问作者Yahya Elfaqir

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 11:22:34