谈谈JS中的函数柯里化

497 阅读2分钟

定义:根据百度百科定义,柯里化就是“把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数且返回结果的新函数的技术”。说的通俗点就是,如果普通函数接收2个或2个以上的参数,那么柯里化就是将这个函数拆分成两个或两个以上的函数,其中一个函数固定参数,其他函数接收其他参数并处理。

很不好理解是吧,我们先来一个栗子看下。

function isStr (reg, prop) {
  return reg.test(prop);
}
function isNum (reg, prop) {
  return reg.test(prop);
}
console.log(isStr(/[a-z]+/g, 'abcd')); // true
console.log(isNum(/[0-9]+/g, 123)); // true

如果我们需要验证字符串或数字,很普通的做法就是封装两个函数,通过传入正则和字符串进行判断,但是如果我们后期新增需求,比如我要验证一个字符串是否为身份证,是否为手机号码,是否为邮箱等等,那么我们要封装N个函数,而且这些函数还有很多相同的部分,这就产生了冗余代码,柯里化可以说就是用来减少这些冗余代码的。比如我们上面的示例可以用柯里化优化一下。

function check (reg) {
  return function (text) {
    return reg.test(text);
  };
}

var isStr = check(/[a-z]+/g);
var isNum = check(/[0-9]+/g);

console.log(isStr('abc')); // true
console.log(isNum(123)); // true

看到这里你可能会说,这个和原来的没有减少什么代码啊,而且看起来很复杂,可是我们想想,如果我们加一个验证,比如校验是否为邮箱,那么我们只需要在优化的代码中加一行代码即可,即:

var isEmail = check(/[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+/g);

上面的优化代码中,第一个参数是已经固定了的,无论我们在什么地方调用,我们只需要传入需要验证的字符串即可,这样第一可以减少代码,第二可以避免误操作。

讲到这里,JS中函数柯里化的作用就出来了。 1、参数复用,也叫固定易变参数 2、减少代码冗余 3、增加代码的可读性

我们来看一个很经典的面试题目。

编写sum函数使得,sum(1)(2) === sum(1, 2);
function sum (x) {
  if (arguments.length === 2) {
    return x + arguments[1];
  }
  return function(y){
    return x + y;
  }
}

截止至这里,函数柯里化已经全部讲完了。