文章目录
1. 什么是函数柯里化
在计算机科学中,柯里化(Currying)是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数且返回结果的新函数技术。
eg:
// 这是一个接受3个参数的函数
const add = function(x,y,z){
return x+y+z;
}
我们可以将其变换一下,得到这样一个函数:
// 接受一个单一参数
const curryingAdd = function(x){
// 并且返回接受余下的参数的函数
return function(y,z){
return x+y+z;
}
}
从调用上对比区别:
// 调用add()
add(1,2,3);
// 调用curryingAdd()
curryingAdd(1)(2,3);
// 等价于下面的
const fn = curryingAdd(1);
fn(2,3);
可以看到,变换后的函数可以分批次接受参数。
甚至fn返回的函数还可以继续变换。
eg:
const curryingAdd = function(x) {
return function(y) {
return function(z) {
return x + y + z
}
}
}
// 调用
curryingAdd(1)(2)(3)
// 即
const fn = curryingAdd(1)
const fn1 = fn(2)
fn1(3)
上边展示了两次变换过程。
简单讲就是把一个多参数的函数f,变换成接受部分参数的函数g,并且这个函数g会返回一个函数h,函数h用来接受其他参数。函数h可以继续柯里化。
2. 柯里化常用场景
2.1 参数复用
工作中会遇到的需求:通过正则校验电话号、邮箱、身份证是否合法等等。
于是我们封装一个校验函数如下:
/**
* @description 通过正则校验字符串
* @param {RegExp} regExp 正则对象
* @param {String} str 待校验字符串
* @return {Boolean} 是否通过校验
*/
function checkByRegExp(regExp,str){
return regExp.test(str);
}
假如我们要校验很多手机号、邮箱,我们就会这样调用:
// 校验手机号
checkByRegExp(/^1\d{10}$/, '15152525634');
checkByRegExp(