函数柯里化

85 阅读1分钟

今日相对清闲,对函数柯里化做了一个了解;觉得柯里化更多的是提供了一种思路,就像做数学题一样;

比如说给一个题目,要求multi(2,3,4)、multi(2,3)(4)、multi(2)(3)(4)都输出24;

此刻我们都可以想到把这三个参数相乘就是24了,那如何才能拿到三个参数后再去执行相乘呢;

既然是相乘,肯定是有一个方法是返回 a * b * c;

// multi(2)(3)(4)=24?

// 从题目中可以看出,要实现的是一个柯里化函数;
// 什么是柯里化?传入的参数如果小于执行函数的形参数量,返回函数,并把刚才传递的第一个参数携带过去,如此循环,直到传入的参数长度等于执行函数的形参长度

function curry (fn, args) {
  let len = fn.length; // 函数形参的长度
  let _args = args || [];
  return function () {
    let newArgs = _args.concat(Array.prototype.slice.call(arguments));//下面调用时传入的参数就是arguments
    // 如果参数长度小于形参,继续柯里化
    if (newArgs.length < len) {
      return curry.call(this, fn, newArgs) // 这里的newArgs传入后就是形参中的args
    } else {
      // 如果传入的参数和函数形参的长度一样,执行函数
      return fn.apply(this, newArgs)
    }
  }
}

let multi = curry(function(a,b,c){
  return a * b * c
})

multi(2, 3, 4) // 24
multi(2)(3)(4) // 24
multi(2, 3)(4) // 24