1. function adds(a, b, c) {
    2. return a + b + c
    3. }
    4. function currying(fn, length){
    5. length = length || fn.length; // 第一次调用获取函数 fn 参数的长度,后续调用获取 fn 剩余参数的长度
    6. return function(){
    7. var args = [].slice.call(arguments) // currying返回函数接受的参数
    8. if (args.length < length) { // 判断参数的长度是否小于 fn 剩余参数需要接收的长度
    9. return curry(fn.bind(this, ...args), length - args.length) // 递归 currying 函数,新的 fn 为 bind 返回的新函数(bind 绑定了 ...args 参数,未执行),新的 length 为 fn 剩余参数的长度
    10. }else {
    11. return fn.call(this, ...args) // 执行 fn 函数,传入新函数的参数
    12. }
    13. }
    14. }
    15. var addCurry = currying(adds);
    16. // 极简版
    17. const currying = fn =>
    18. judge = (...args) =>
    19. args.length >= fn.length
    20. ? fn(...args)
    21. : (...arg) => judge(...args, ...arg)
    22. var addCurry = currying(adds);
    23. addCurry(2)(3)(4) // 9
    24. addCurry(2, 3)(4) // 9
    25. addCurry(2, 3, 4) // 9
    26. addCurry(2)(3, 4) // 9
    27. // 其他版本
    28. function add() {
    29. let data = [].concat(Array.prototype.slice.call(arguments))
    30. function tmp() { // 使用闭包
    31. data = data.concat(Array.prototype.slice.call(arguments))
    32. return tmp;
    33. }
    34. tmp.valueOf = function () {
    35. return data.reduce(((source, item) => source + item), 0);
    36. }
    37. tmp.toString = function () {
    38. return data.reduce(((source, item) => source + item), 0);
    39. }
    40. return tmp
    41. }
    42. add(1) // 1
    43. add(1,4)(2); // 7
    44. add(1)(2, 5)(3)// 11
    45. add(1,5,6)(2,5)(3)(4, 4) // 30