# 17.函数柯里化

# 面试原题

sum(1)(2)(3).count(); //6

function curryingAdd(x) {
  let sum = x;
  let temp = function (y) {
    sum += y;
    return temp;
  };
  temp.count = function () {
    return sum;
  };
  return temp;
}
console.log(curryingAdd(1)(2)(3).count()); //6
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 实现一个add方法,使计算结果能够满足如下预期:
add(1)(2)(3) = 6;
add(1, 2, 3)(4) = 10;
add(1)(2)(3)(4)(5) = 15;

function add() {
    // 第一次执行时,定义一个数组专门用来存储所有的参数
    var _args = Array.prototype.slice.call(arguments);

    // 在内部声明一个函数,利用闭包的特性保存_args并收集所有的参数值
    var _adder = function() {
        _args.push(...arguments);
        return _adder;
    };

    // 利用toString隐式转换的特性,当最后执行时隐式转换,并计算最终的值返回
    _adder.toString = function () {
        return _args.reduce(function (a, b) {
            return a + b;
        });
    }
    return _adder;
}
add(1)(2)(3)                // 6
add(1, 2, 3)(4)             // 10
add(1)(2)(3)(4)(5)          // 15
add(2, 6)(1)                // 9
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
// 实现一个add方法,使计算结果能够满足如下预期:
add(1)(2)(3)() = 6;
add(1, 2, 3)(4)() = 10;
add(1)(2)(3)(4)(5)() = 15;

function add(...initArgs) {
    // 第一次执行时,定义一个数组专门用来存储所有的参数
    var _args = initArgs.slice();
    // 在内部声明一个函数,利用闭包的特性保存_args并收集所有的参数值
    var _adder = function (...args) {
        if (args.length > 0) {
            if (args.length) _args.push(...args);
            return _adder;
        } else {
            console.log(
                _args.reduce((a, b) => {
                    return a + b;
                })
            );
        }
    };
    return _adder;
}
add(1)(2)(3)(); // 6
add(1, 2, 3)(4)(); // 10
add(1)(2)(3)(4)(5)(); // 15
add(2, 6)(1)(); // 9
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
function plus(value) {
    "use strict";
    var add = function () {
        var args = [];
        var adder = function adder() {
            Array.prototype.push.apply(args,Array.prototype.slice.apply(arguments))
            return adder;
        }
        adder.toString = function () {
            return args.reduce(function(a, b) {
                return a + b;
            })
        }
        return adder;
    }
    return add()(value);
}

plus(2)(3)(5).toString();  // 10;

作者:谢南波
链接:https://www.imooc.com/article/275737
来源:慕课网
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

# 柯里化函数封装

function curry(func, args) {
  args = args || [];
  const length = func.length; // 函数形参数量
  return function () {
    let subArgs = args.slice();
    for (let i of arguments) {
      subArgs.push(i);
    }
    if (subArgs.length >= args) {
      return func.apply(this, subArgs);
    } else {
      return curry.call(this, func, subArgs);
    }
  };
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Last Updated: 6/3/2024, 1:08:34 AM