充分理解 curry 并能够封装 curry.js。

curry

doc curry

我对 curry(柯里化函数) 的理解:

  • curry 函数接收的参数是?
    答:curry 函数接收的第一个参数是一个函数,接收的后续参数是第一个参数(函数)的参数。
  • curry 函数的返回值是?
    答:返回值是一个新的函数,无论参数够还是不够,都是返回一个新函数,即便参数数量够了,也不会立即执行第一个参数(函数)。
  • curry 函数怎么用?
    答:接收剩余参数用的。
  • curry 函数的应用场景?
    答:不知道。。。
    网上虽然介绍了很多,但是实战经验不足,体会不到它有啥用。

柯里化函数的使用示例:

  1. // 某个函数 A 调用它需要传入 4 个参数 当我们使用 curry 调用它时 分下面几种情况
  2. function A (a, b, c, d) {
  3. console.log(a + b + c + d);
  4. }
  5. // 参数数量不够
  6. B = curry(A, 1, 2);

此时 curry(A, 1, 2) 会返回一个新的函数。该新函数用于接收剩余参数,由于已经传入了两个参数,还差两个参数。剩余的这两个参数将由返回的新的函数来接收。

  1. // 参数够了
  2. B(3, 4); // => 10
  1. // 参数依旧不够
  2. C = B(3);
  3. C(4); // 参数够了 会打印10

同理,此时 B(3) 会返回一个新的函数,因为参数依旧不够。返回的新函数用于接收剩余参数,此时还差一个参数。

  • curry.js
  1. /**
  2. * 柯里化
  3. * 用户固定某个函数的前面的参数,得到一个新的函数,新函数调用时,接收剩余参数。
  4. */
  5. function curry(func, ...args) {
  6. return function (...subArgs) {
  7. const allArgs = [...args, ...subArgs]; // 拼接两个数组
  8. // 参数够了
  9. if (allArgs.length >= func.length) { // func.length 获取 func 函数的形参数量
  10. return func(...allArgs); // 直接调用 func 函数 并将所有参数 allArgs 当做形参传进去
  11. } else { // 参数依旧不够
  12. return curry(func, ...allArgs); // 递归
  13. }
  14. }
  15. }

codes

  • 1.js
  1. /*
  2. 在调用函数时,将数组中的值当做形参传入。
  3. */
  4. function test(a, b, c) {
  5. console.log(a, b, c);
  6. }
  7. const arr = [1, 2, 3];
  8. test(...arr); // => 1 2 3
  • 2.js
  1. function cal(a, b, c, d) {
  2. return a + b + c + d;
  3. }
  4. cal(1, 2, 3, 4); // => 10
  5. function curry(func, ...args) {
  6. return function (...subArgs) {
  7. const allArgs = [...args, ...subArgs];
  8. if (allArgs.length >= func.length) {
  9. return func(...allArgs);
  10. } else {
  11. return curry(func, ...allArgs);
  12. }
  13. }
  14. }
  15. const newCal = curry(cal, 1, 2);
  16. newCal(3, 4); // => 10
  17. newCal(4, 5); // => 12
  18. const newCal1 = newCal(5);
  19. const newCal2 = newCal(6);
  20. newCal1(6); // => 14
  21. newCal2(7); // => 16

demo

获取最值