Lawguancong / Daily-Charging-Learning

0 stars 0 forks source link

柯里化Currying #24

Open Lawguancong opened 3 years ago

Lawguancong commented 3 years ago

定义

多个参数函数 -> 单个参数函数 柯里化又可叫部分求值。一个柯里化的函数接收一些参数,接收了这些参数之后,该函数并不是立即求值,而是继续返回另一个函数,刚才传入的参数在函数形成的闭包中被保存起来,待到函数真正需要求值的时候,之前传入的所有参数都能用于求值。 使用柯里化可以简化主函数的复杂度,提高主函数的自闭性,使代码模块化,减少耦合增强其可维护性,提高功能上的可扩张性、灵活性。可以编写出更加抽象、功能化和高效的代码。

特点

• 和闭包思想类似 • 简洁代码:柯里化应用在较复杂的场景中,有简洁代码,可读性高的优点。 • 参数复用:公共的参数已经通过柯化预置了。 • 延迟执行:柯里化时只是返回一个预置参数的新函数,并没有立刻执行,实际上在满足条件后才会执行。 • 管道式流水线编程:利于使用函数组装管道式的流水线工序,不污染原函数。

代码

function sum(a) {
    return function(b) {
        return function(c) {
            return a+b+c;
        }
    }
}
console.log(sum(1)(2)(3)); // 6

引申:实现一个curry函数,将普通函数进行柯里化:
function curry(fn, args = []) {
    return function(){
        let rest = [...args, ...arguments];
        if (rest.length < fn.length) {
            return curry.call(this,fn,rest);
        }else{
            return fn.apply(this,rest);
        }
    }
}
//test
function sum(a,b,c) {
    return a+b+c;
}
let sumFn = curry(sum);
console.log(sumFn(1)(2)(3)); //6
console.log(sumFn(1)(2, 3)); //6

参考链接 https://github.com/mqyqingfeng/Blog/issues/42 https://juejin.cn/post/6844903882208837645 https://www.jianshu.com/p/5e1899fe7d6b