函数式编程-柯里化的运用

64 阅读1分钟

前言

昨天我又又又碰到一道很像柯里化函数的题了,但是它很像却不是柯里化。所以简单记录一下

函数柯里化

针对参数长度固定的函数

function curry(fn, ...args) {
    if (args.length >= fn.length) {
        fn(...args)
    } else {
        return function (...args2) {
            return curry(fn, ...args, ...args2)
        }
    }
}
const add = (a, b, c) => a + b + c
//参数长度固定的时候
console.log("参数长度固定的时候:")
const curryAdd = curryTwo(add)
console.log(curryAdd(1)(2)(3)) //6
console.log(curryAdd(1, 2)(3)) //6
console.log(curryAdd(1)(2, 3))  //6

针对参数不确定的函数的柯里化

function add1(...args) {
    //求和
    return args.reduce((a, b) => a + b)
}
function curry2(fn, ...args) {
    return function (...rest) {
        if (rest.length) {
            return curry2(fn, ...args, ...rest)
        } else {
            return fn.call(this, ...args)
        }
    }
}
let addFn = curry2(add1)
console.log('参数不固定,手动触发')
console.log(addFn(1)(2)(4, 5)()) //12

题目

js实现一个加法器,能够满足add(1)(2)=3;add(1)(2)(3)=6?

题目关键点:闭包+toString的重写
//参数长度不固定-不手动触发
//关键点闭包+重写toString方法
function add3(a) {
    var tmp = function (b) {
        a = a + b;
        return tmp;
    };
    tmp.toString = function () {
        return a;
    };
    return tmp;
}
console.log("参数不固定且非手动触发")
console.log(add3(1)(2)(3)); //6
console.log(add3(1)(2)(3)(4)); //10
这里console.log是没法打印出结果的,我尝试了alert出结果的方法是可以的