如何用闭包实现计算历史追踪与按指令输出结果或历史对象?
闭包实现计算历史跟踪的代码修复方案
问题分析
原代码存在几个关键问题,导致无法满足需求:
- 外层函数
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
相关产品推荐
相关产品推荐

