手写柯里化函数

97 阅读1分钟
// 不纯的
function checkAge(age) {
  let minAge = 18;
  return age >= minAge;
};

//普通纯函数
function checkAge(minAge, age) {
  return age >= minAge;
};



// 柯里化
function checkAge(minAge) {
  return function (age) {
    return age >= minAge;
  };
};



// es6
const checkAge = (minAge) => (age) => age >= minAge
console.log(checkAge(18)(16)) // false
console.log(checkAge(18)(22)) // true


const _ = require('lodash')
// curry 功能:创建一个函数,该函数接收一个或多个func参数,
// 如果func所需要的参数都被提供则执行func并返回执行结果。
// 否则继续返回该函数并等待接收剩余的参数
const newCheckAge = _.curry(function (minAge, age) {
  return age >= minAge})
console.log(newCheckAge(18)(16)) // false
console.log(newCheckAge(18, 22)) // true
console.log(newCheckAge(18)) // function


function curry(fn) {
  return function curriedFn(...args) {
    // 判断实参和形参的个数,fn.length代表fn的参数的长度
    if (args.length < fn.length) {
      // args 上一次传递的实参, 拼接第二次的实参
      return function () {
        return curriedFn(...args.concat(Array.from(arguments)));
      }
    }
    return fn.apply(fn, args);
  }
}
// 形参
const curryFn = curry(function (minAge, age) {
  return age >= minAge})
// 实参
console.log(curryFn(18, 2)) // false
console.log(curryFn(18, 22)) // true
console.log(curryFn(18)(22)) // true


function curry1(fn) {
  return function curriedFn(...args) { 
   if (args.length < fn.length) {
      return function () {
        return curriedFn([...args, ...arguments]);
      }
    }
    return fn.apply(fn, args);
  }
}
const newFn = curry1(function (a, b) {
    return a + b})
console.log(newFn(1, 2)) // 3
console.log(newFn(1, 3)) // 4