js 函数柯里化

273 阅读1分钟

什么是柯里化?

柯里化是指将一个函数 fn(a, b, c) 转变为可以用 fn(a)(b)(c) 调用的形式

能够进行柯里化转换的方法接收的参数个数都是固定的,像是 fn (...args) 这样接收不确定参数的方法不能进行柯里化

那么怎么实现呢,先考虑一种简单的情况

const sum = (a, b) => {
	return a + b
}

const curry = (fn) => {
	// ...
}

const curriedSum = curry(sum)

curriedSum(1)(2) //

怎么实现 curriedSum(1)(2) 这样的调用呢,只要保证 curriedSum(1) 返回的也是一个 function,并且接收一个参数就行了,由此,我们写出实现的代码

const curry = (fn) => {
	return function (a) {
  	return function (b) {
    	return fn (a, b)
    }
  }
}

那么开始思考,这是实现了传入两个参数的方法的柯里化,那么传入三个参数呢,只需要再加一层 return function,那么传入任意个参数呢,要怎么实现呢

通过 fn.length 我们可以拿到原来的方法需要的参数个数,那么我们的思路就是,递归调用 curry,将要调用的参数作为参数传入,每次递归调用,要调用的参数都会增加并保存下来,直到和 fn.length相等,此时结束递归,调用 fn即可

const curry = (fn, ...args) => {
	if (fn.length > args.length) {
  	return function (...args2) {
    	return curry(fn, ...args, ...args2)
    }
  } 
  return fn(...args)  // else
}