实现一个函数add(1)(2, 3)(4).getValue()

仅支持两次调用

  1. function add(x) {
  2. return function (y) {
  3. return x+y
  4. }
  5. }
  6. console.log(add(2)(3)) // 5

currying

valueOf 获取最终结果

支持无限次调用

  1. function add(x) {
  2. let sum = x;
  3. function resFn(y) {
  4. sum += y;
  5. return resFn
  6. }
  7. resFn.valueOf = function() {
  8. return sum;
  9. }
  10. return resFn;
  11. }
  12. console.log(add(2)(3).valueOf()) // 5

支持多参数、不限次调用

  1. function add(x) {
  2. let sum = x;
  3. function resFn(...y) {
  4. if (y instanceof Array) {
  5. for (let i =0; i < y.length; i++) {
  6. sum += y[i]
  7. }
  8. } else {
  9. sum += y;
  10. }
  11. return resFn
  12. }
  13. resFn.valueOf = function() {
  14. return sum;
  15. }
  16. return resFn;
  17. }
  18. console.log(add(2)(3).valueOf()) // 5
  19. console.log(add(2)(3, 4)(5).valueOf()) // 14

优化

  1. function add(x) {
  2. let sum = x;
  3. function resFn(y) {
  4. for (let i =0; i < arguments.length; i++) {
  5. sum += arguments[i]
  6. }
  7. return resFn
  8. }
  9. resFn.valueOf = function() {
  10. return sum;
  11. }
  12. return resFn;
  13. }
  14. console.log(add(2)(3).valueOf()) // 5
  15. console.log(add(2)(3, 4)(5).valueOf()) // 14

调用()终止并获取sum

  1. function add(x) {
  2. let sum = x;
  3. return function resFn(y) {
  4. if (arguments.length) {
  5. for (let i = 0; i < arguments.length; i++) {
  6. sum += arguments[i]
  7. }
  8. return resFn;
  9. }
  10. return sum
  11. }
  12. }
  13. console.log(add(2)(3)()) // 5
  14. console.log(add(2)(3, 4)(5)()) // 14

指定数量参数返回sum

  1. function add() {
  2. let args = [...arguments];
  3. function resFn() {
  4. args = [...args, ...arguments]
  5. if (args.length >= 3) {
  6. return args.slice(0, 3).reduce((a, c) => a+c, 0)
  7. }
  8. return resFn;
  9. }
  10. return resFn();
  11. }
  12. console.log(add(2)(3)(4)) // 9
  13. console.log(add(2, 3, 4)) // 9
  14. console.log(add(2, 3)(4)) // 9
  15. console.log(add(2)(3, 4)) // 9

参考:

https://theanubhav.com/2019/02/03/js-currying-in-interview/