函数柯里化

109 阅读3分钟

面试:说一说函数柯里化

函数柯里化(Currying)是一种将接受多个参数的函数转化为一系列嵌套的函数,每个嵌套函数只接受一个参数的技术。

将一个接受多个参数的函数柯里化有以下几个作用:

  1. 参数复用:柯里化可以通过部分应用(partial application)的方式,固定一部分参数,生成一个新的函数。这样可以在后续调用时,只需提供剩余参数,实现参数的复用。

  2. 延迟执行:柯里化可以延迟函数的执行,将原先一次性需要传入所有参数的函数,转化为按需传入参数的嵌套函数。这样在需要的时候才会触发函数的执行。

  3. 功能扩展:柯里化可以通过不同的参数组合,生成具有不同功能的新函数。这样可以更灵活地扩展函数的功能。

函数柯里化一般会用到以下几个场景:

  1. 参数复用:当一个函数有多个参数,但其中某几个参数在不同的调用中保持不变时,可以使用柯里化将这部分参数固定下来,生成一个新的函数,以实现参数的复用。

  2. 部分应用:在一些场景中,我们需要事先确定部分参数,等到后续再传入剩余参数。通过柯里化可以将这一过程拆分,先固定部分参数生成新的函数,然后再根据需要传入剩余参数。

  3. 函数组合:柯里化可以使函数组合变得更加灵活。通过将多个函数柯里化,可以生成一系列中间函数,再将这些中间函数组合成一个最终函数,实现复杂功能的拼装。

请注意,柯里化并不是必选的技术,它依赖于具体的场景和需求。在一些简单的情况下,使用柯里化可能会增加代码的复杂性。因此,在实际开发中,需要权衡柯里化带来的优势与代码的简洁性。

一、什么是函数柯里化(what)

把接受多个参数的函数换成接受单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术。

柯里化的定义,接收一部分参数,返回一个函数接收剩余参数,接收足够参数后,执行原函数。

二、为什么要柯里化(why)

柯里化的意义:

1.我们不方便传入参数(promise,回调)

function a(b) {};
promise.resolve().then();

//现在要求 then() 里面需要接受的是 a 函数,并且 a 函数必需要传入 b 参数。
//但是 then() 里面的回调函数必须是接受一个函数,而不是调用一个函数。所以不能直接使用 then(a(b)) ,而是需要使用函数柯里化。

promise.resolve().then(a.bind(this,b))

2.我们写了一个方法,但是这个方法很多时候调用起来参数是固定的

function miu(a, b) {
    return a * b;
}
miu(2,1);
miu(2,3);
miu(2,4);
miu(2,5);

//后面调用这个 miu() 函数的时候,发现很多时候都有参数2,所以可以基于 miu() 函数创建一个 double() 函数,
//这样在后续复用时可以直接传入一个参数就行,如:

var double = miu.bind(null, 2);
console.log(double(3));

具体可以参考以下文章: 「前端进阶」彻底弄懂函数柯里化