30.JS高阶技巧之currying函数

这篇博客探讨了两种JavaScript实现累加功能的方法。方案一利用闭包和累加器,每次调用函数时更新参数并返回自身,直到所有数值传入完毕。方案二采用柯里化(Currying)技术,通过递归方式逐步接收参数,最终达到累加效果。两种方法都展示了JavaScript函数式编程的灵活性。
摘要由CSDN通过智能技术生成

1. 编写一个ADD函数满足如下需求

add(1);       //1
add(1)(2);    //3
add(1)(2)(3); //6
add(1)(2,3);  //6
add(1,2)(3);  //6
add(1,2,3);   //6

实现方案一

 function add(...outerArgs) {
	add = function (...innerArgs) {
		outerArgs.push(...innerArgs);
		return add;
	};
	add.toString = function () {
		return outerArgs.reduce((x, y) => x + y);
	};
	return add;
}
let res = add(1, 2)(3)(4)(5)(6, 7);
console.log(res);  
//=>alert会把输出的值转换为字符串(toString())

第一次执行ADD outerArgs=[1,2] 重写了ADD
第二次执行ADD innerArgs=[3] outerArgs=[1,2,3]
第三次执行ADD innerArgs=[4] outerArgs=[1,2,3,4]

outerArgs=[1,2,3,4,5,6,7]
console.log(res.toString());

实现方案二

function currying(anonymous, length) {
  return function add(...args) {
 		if (args.length >= length) {
			return anonymous(...args);
		}
 		return currying(anonymous.bind(null, ...args), length - args.length);
 	}
 }
 let add = currying(function anonymous(...args) {
 	return args.reduce((x, y) => x + y);
 }, 4);
// console.log(add(1, 2,3)(3)(4));

AO(currying)
anonymous=求和函数
length=4
ADD第一次执行 args=[1,2]
currying第二次执行
anonymous=求和函数 预先传递的参数[1,2]
length=2
ADD第二次执行 args=[3]
currying第三次执行
anonymous=求和函数 预先传递的参数[3]
length=1
ADD函数第三次执行 args=[4]
把上一次的求和函数执行(4)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值