1. function add() {
    2. // 第一次执行时,定义一个数组专门用来存储所有的参数
    3. var _args = Array.prototype.slice.call(arguments);
    4. // 在内部声明一个函数,利用闭包的特性保存_args并收集所有的参数值
    5. var _adder = function() {
    6. _args.push(...arguments);
    7. return _adder;
    8. };
    9. // 利用toString隐式转换的特性,当最后执行时隐式转换,并计算最终的值返回
    10. _adder.toString = function () {
    11. return _args.reduce(function (a, b) {
    12. return a + b;
    13. });
    14. }
    15. return _adder;
    16. }
    1. add(1)(2)(3) // 6
    2. add(1, 2, 3)(4) // 10
    3. add(1)(2)(3)(4)(5) // 15
    4. add(2, 6)(1) // 9
    1. function curry(fn, args=[]) {
    2. return function() {
    3. let newArgs = args.concat(Array.prototype.slice.call(arguments))
    4. if (newArgs.length < fn.length) { // 假如:实参个数 < 形参个数
    5. return curry.call(this, fn, newArgs)
    6. } else {
    7. return fn.apply(this, newArgs)
    8. }
    9. }
    10. }
    11. // ES6 高颜值写法
    12. const curry = fn =>
    13. judge = (...args) =>
    14. args.length === fn.length
    15. ? fn(...args)
    16. : (arg2) => judge(...args, arg2)