JavaScript中实现多调用clos函数求助(基于闭包)
实现满足特定调用逻辑的JavaScript闭包函数
需求说明
需要实现一个clos函数,满足以下调用行为:
clos() => 输出 "AB" clos()() => 输出 "ABC" clos()()() => 输出 "ABCC" clos()()()() => 输出 "ABCCC" clos()()()()('xyz') => 输出 "ABCCCxyz"
你的代码问题分析
你当前的实现存在几个核心问题:
- 首次调用
clos()直接返回字符串,无法支持后续的链式调用 - 计数器与生成的字符串中
C的数量不匹配,调用次数和C的个数对应关系错误 - 没有处理传入自定义参数(如
'xyz')的场景 - 未实现函数被直接打印时输出对应字符串的逻辑
正确实现代码
function clos() { let count = 0; const baseStr = "AB"; function innerFn(param) { // 处理传入自定义参数的情况 if (param !== undefined) { console.log(`${baseStr}${'C'.repeat(count)}${param}`); return; } count++; // 重写toString方法,让函数被打印时输出对应字符串 return Object.assign(innerFn, { toString() { return `${baseStr}${'C'.repeat(count)}`; } }); } // 初始返回的函数,toString输出AB(count初始为0) return Object.assign(innerFn, { toString() { return `${baseStr}${'C'.repeat(count)}`; } }); } // 测试验证 console.log(clos()); // 输出 "AB" console.log(clos()()); // 输出 "ABC" console.log(clos()()()); // 输出 "ABCC" console.log(clos()()()()); // 输出 "ABCCC" clos()()()()('xyz'); // 输出 "ABCCCxyz"
实现逻辑说明
- 闭包保存状态:通过闭包将
count变量保存在外层函数作用域中,记录链式调用的次数 - 自定义toString方法:利用
Object.assign给返回的函数添加自定义toString方法,这样当函数被直接打印时,会自动调用该方法返回目标字符串 - 参数处理:判断是否有参数传入,若有则直接拼接当前生成的字符串与参数并输出,结束调用链
- 链式调用支持:每次无参数调用时,递增计数器后返回函数自身,实现链式调用
内容的提问来源于stack exchange,提问作者Asif khan
相关产品推荐
相关产品推荐

