写给小白的函数柯里化

865 阅读2分钟

高大上的柯里化呀,前前后后看了好多次都弄不明白,今天硬逼着自己研究,总算有了一点小小心得,记录下来给大家分享一下。先声明一句:本文只涉及到了非常浅显的部分,希望大佬们一笑而过。

一、什么是柯里化?

柯里化其实是函数式编程的一个过程,在这个过程中我们能把一个带有多个参数的函数转换成一系列的嵌套函数。它返回一个新函数,这个新函数期望传入下一个参数。

它不断地返回新函数(像我们之前讲的,这个新函数期望当前的参数),直到所有的参数都被使用。参数会一直保持 alive (通过闭包),当柯里化函数链中最后一个函数被返回和调用的时候,它们会用于执行。

大白话就是:柯里化就是,当参数不满足要求时,先通过闭包把参数保存起来,当参数满足要求时再进行计算,返回结果。

add(1)(2)(3)
//6

像上面的例子,add(1)、add(1)(2)都并没有进行累加操作,只当参数达到预设条件(3个),才会一次性累加。

那么1、2去了哪里呢?当然它们被保存在了闭包里。柯里化的秘密就是闭包,通过闭包把参数保存下来。

二、写一个简单的例子

请实现一个简单的函数,它具有以下功能:

add(1); 		// 1
add(1)(2);  	// 3
add(1)(2)(3);// 6
add(1)(2, 3); // 6
add(1, 2)(3); // 6
add(1, 2, 3); // 6

直接贴代码,注意看注释

function curry (fn) {
  //函数有length属性,指传入其的参数的个数
  const finalLen = fn.length
  //用闭包存放传入的参数
  let args = []
  return function currying () {
    //实时参数,arguments是伪数组,Array.from能将其转换成数组
    args = args.concat(Array.from(arguments))
	//args=args.concat([].slice.call(arguments))
    //args=args.concat(Array.prototype.slice.call(arguments))
    const len = args.length
    //参数的数量达到3个时,累加计算,未达到时,继续保存参数
    return len >= fn.length ? fn.apply(this, args) : currying
  }
}
function add (a,b,c) {
  return a+b+c
}
const add1 = curry(add)
console.log(add1(1, 2)(3))

不想写了,这只是柯里化的冰山一角,更多内容请大家自己去发现吧。