JavaScript使用Currying实现日期时间格式化调用异常问题求解
问题原因
你当前实现的curry函数是固定三层嵌套的硬编码逻辑,每一层仅接收第一个入参,其余传入的参数都会被直接丢弃。所以只有每次仅传1个参数的date(1)(12)(2020)能走完所有嵌套层返回最终结果,其余多参数传入的调用都会停在中间嵌套层,返回匿名函数。
解决方案
实现支持收集任意数量入参的通用柯里化函数,逻辑为:每次调用时收集所有传入的参数,判断已收集的参数总数是否等于原函数要求的形参数量,数量足够则执行原函数返回结果,不足则返回新函数继续收集后续参数。
正确实现代码如下:
function curry(func) { // 接收后续传入的参数,和已收集的参数合并 return function curried(...args) { // 已收集参数数量达到原函数要求的入参数,直接执行 if (args.length >= func.length) { return func.apply(this, args); } else { // 数量不足,返回新函数继续收集参数 return function(...nextArgs) { return curried.apply(this, args.concat(nextArgs)); } } } } function format_date(a,b,c){ return a+"." + b +"."+c; } var date= curry(format_date); // 四种调用均会输出1.12.2020 console.log(date(1)(12)(2020)); console.log(date(1,12)(2020)); console.log(date(1)(12, 2020)); console.log(date(1,12, 2020));
内容的提问来源于stack exchange,提问作者Filip
相关产品推荐
相关产品推荐

