实现add(1)(2)(3)

考点: 函数柯里化

一、什么是函数柯里化(curry)

函数柯里化(curry)是函数式编程里面的概念。curry的概念很简单:柯里化是把接受多个参数的函数转变为接受一个单一参数的函数,并且返回接受余下的参数且返回结果的新函数

简单说就是:每次调用函数时,它只接收一部分参数,并返回一个函数,直到传递完所有的参数为止。

二、例子

1.接收两个参数

const add =(x,y) => x+y;
// add(1,2);
// 调整为每次只接收一个参数
const add = x => y => x+y;
// add(1)(2);

2.接收三个参数

尝试实现add(1)(2)(3)
仿照上面

const add = x => y => z => x+y+z;

看起来并不是那么难,但是如果面试官的要求是实现一个add函数,同时支持下面这几种的用法呢:

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

主要思路:判断当前传入函数的参数个数 (args.length) 是否大于等于原函数所需参数个数 (fn.length) ,如果是,则执行当前函数;如果是小于,则返回一个函数。

  • fn.length: 表示的是这个函数中参数的个数.
	const curry = (fn, ...args) =>
			// 函数的参数个数可以直接通过函数的.length属性来访问
			args.length >= fn.length
				// 传入的参数大于等于原始函数fn的参数个数,则直接执行该函数
				? fn(...args)
				/**
				 * 传入的参数小于原始函数fn的参数个数时
				 * 则继续对当前函数进行柯里化,返回一个接受所有参数(当前参数和剩余参数) 的函数
				*/
				: (..._args) => curry(fn, ...args, ..._args);

		function add1(x, y, z) {
			return x + y + z;
		}
		const add2 = curry(add1);
		console.log(add2(1, 2, 3));// 6
		console.log(add2(1)(2)(3));// 6
		console.log(add2(1, 2)(3));// 6
		console.log(add2(1)(2, 3));// 6

3.参数长度不固定

function add(..args){return args.reduce((a,b)=> a+b}
function currying(fn){
	let args=[]
	return function temp(...newArgs){
		if(newArgs.length){
			args = [...args, newArgs]
			return temp
		} else {
			let val = fn.apply(this, args)
			args = []
			return val
		}
	}
}
let addCurry = currying(add)
console.log(addCurry(1)(2)(3)(4, 5)())
console.log(addCurry(1)(2)(3, 4, 5)())
console.log(addCurry(1)(2, 3, 4, 5)())

三、柯里化有什么作用

  1. 参数复用
  2. 提前返回
  3. 延迟执行
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值