概念

函数柯里化(currying)是指一种闭包使用技巧,可以达到函数参数有更高的灵活度。

内容

指的每次函数只处理一个参数,并返回处理剩余参数的新函数的过程。即每个柯里化过程都会将待处理的其中一个参数进行处理。

语法

  1. //传统
  2. function demo(num1,num2){
  3. }
  4. //将demo柯里化之后
  5. function demo(num1){
  6. function inner(num2){
  7. //处理num1 和num2
  8. }
  9. return inner;
  10. }

例子:三个数字的相加

  1. //传统
  2. function add(num1,num2,num3){
  3. return num1+num2+num3;
  4. }
  5. //柯里化:一层
  6. function curryingAdd(num1,num2){
  7. function inner(num3){
  8. return num1 +num2 +num3;
  9. }
  10. return inner;
  11. }
  12. // 5+6+7 5+6+8 5+6+9 5+6+10
  13. let add = curryingAdd(5,6);
  14. add(8);
  15. add(9);
  16. add(10)

柯里化一个参数之后,后面的第三个参数就会更加灵活,同时可以重复调用 add函数,达到前两个参数的复用。

  1. //两层柯里化
  2. function curryingAdd2(num1){
  3. function inner(num2){
  4. function inner2(num3){
  5. return num1 +num2 +num3;
  6. }
  7. return inner2;
  8. }
  9. return inner;
  10. }
  11. //每个参数都可以定制
  12. let add5 = curryingAdd2(5);
  13. let add56 = add5(6);
  14. console.log(add56(7));

每个参数都可以实现定制,即很高的灵活性。

柯里化应用-正则表达式

  1. //传统的方式两个参数必须同时提供,不是很灵活
  2. //完成手机号的验证
  3. function checkReg(reg,str){
  4. return reg.test(str);
  5. }
  6. checkReg( /^1[3-9]\d{9}$/,'12909090909');
  7. checkReg( /^1[3-9]\d{9}$/,'12909090988');
  8. checkReg( /^[A-Z]\w{5,15}$/,'12909090977');
  9. checkReg( /^[A-Z]\w{5,15}$/,'12909090966');
  1. //可以实现第二个参数的灵活度,以及第一个正则表达式参数的复用。
  2. //一层柯里化后
  3. function checkRegCurrying(reg){
  4. function inner(str){
  5. return reg.test(str);
  6. }
  7. }
  8. //手机号验证
  9. let checkPhone = checkRegCurrying(/^1[3-9]\d{9}$/);
  10. checkPhone('12909090909')
  11. checkPhone('12909090908')
  12. checkPhone('12909090907')
  13. //密码验证
  14. let checkPass = checkRegCurrying(/^[A-Z]\w{5,15}$/);
  15. checkPass("ad1232");