Sky
HOME
HOME
  • 前端笔记

    • CSS

      • 盒子模型
      • 屏幕单位
      • CSS 性能优化
    • JavaScript

      • Methods

        • Scheduler
        • Deep Clone
        • Curry
        • Calculation Function
        • debounce & throttle
      • Function bind
      • Array reduce
      • cross domain
      • event loop
      • ajax
      • event
      • context
      • inheritance
      • prototype
    • HTML

      • html render
      • forbidden <a>
      • <meta>
      • <script>
    • uni-app

      • scroll table

Curry | 柯里化

函数柯里化(curry)是函数式编程里面的概念。curry的概念很简单:只传递给函数一部分参数来调用它,让它返回一个函数去处理剩下的参数。

简单点来说就是:每次调用函数时,它只接受一部分参数,并返回一个函数,直到传递所有参数为止。

柯里化工具函数


/**
 * @description: 将函数柯里化的工具函数
 * @param   { Function }    fn 待柯里化的函数
 * @param   { array }       args 已经接收的参数列表
 * @return  { Function }
 */
const currying = function(fn, ...args) {
    // fn需要的参数个数
    const len = fn.length;
    // 返回一个函数接收剩余参数
    return function (...params) {
        // 拼接已经接收和新接收的参数列表
        let _args = [...args, ...params];
        // 如果已经接收的参数个数还不够,继续返回一个新函数接收剩余参数
        if (_args.length < len) {
            return currying.call(this, fn, ..._args);
        }
       // 参数全部接收完调用原函数
        return fn.apply(this, _args);
    }
}

// ex: 

function add(a, b, c) {
    return a + b + c;
}

const addCurry = currying(add);

console.log(addCurry(1)(2)(3)); // 6
console.log(addCurry(1, 2)(3)); // 6
console.log(addCurry(1)(2, 3)); // 6

柯里化 add 函数


function add(){
    let arr = [ ...arguments ];
    let _len = arr.length;
    // 没有参数,返回结果
    if(!_len)return 0;
    
    let _fn =  function(){
        let _agrs = [ ...arguments ];
        if(_agrs.length){
            // 有参数,继续缓存参数,返回函数
            arr.push(..._agrs);
            return _fn;
        }else{
            // 最后一次调用,处理返回结果
            return arr.reduce((a,b)=>a+b);
        }
    }

    return _fn;
};

console.log(add(1)(2)(3)(4)(5)()); // 15
console.log(add(1,2,3)(4)(5)()); // 15
console.log(add()); // 0

最近更新: 2023/12/5 14:55
Contributors: liujw155@outlook.com
Prev
Deep Clone
Next
Calculation Function