闭包与柯里化、偏应用函数的关系

324 阅读3分钟

柯里化

- 定义:

将接收 多个参数 的一个函数,改造为每次接收一个函数的多个互相嵌套的函数。即,加入本来有一个打印一个人“城市,学校名称,姓名的”函数,需要接受“城市”,“学校”,“名字”三个参数,柯里化就是改为嵌套三层,每次只传一个参数。

- 如下举例:

function person(city,school,name){
   return city+school+name;
}

person("成都市","成都七中","小李"); //成都市成都七中小李

然后我们来柯里化该函数

function person(city){
   return function (school){
     return function(name){
        city+school+name;
     }
   }
}

person("成都市")("成都七中")("小李"); //成都市成都七中小李

以上就是柯里化的函数,满足一次只接受一个函数的,多层函数嵌套模式。

那么,问题来了,我们为什么要这么做呢?这么做能带来什么好处呢?

- 解决的问题:

按照通常的方式,我们要打印成都七中x个同学的信息需要如下做:

person("成都市","成都七中","小李");
person("成都市","成都七中","小红");
person("成都市","成都七中","小张");

这样做能实现,但是,既然是固定的学校,城市,我们为什么要把城市和学校的参数多次重复的传递呢?如果是柯里化的函数,我们可以这样调用。

 let school=person("成都市")("成都七中");
 school("小李");//成都市成都七中小李
 school("小红");//成都市成都七中小红
 school("小张");//成都市成都七中小红

这样一来school()就会自动带上成都市成都七中,我们只需要传递需要变更的名字参数就行了,这就是柯里化带来的好处。

- 柯里化与闭包的关系

看到这里,相比也了解了何里化,那我们来回答下这篇文章的题目,闭包与科里化有什么关系呢? 我们来回顾下何为闭包。

  • 闭包 闭包就是在执行一个函数中引用了别的函数中的变量,并因此让该变量在其所在函数执行完毕后也并不会销毁,从而达到持久化存在的目的。

通过柯里化实现的函数person,我们可以看出,就是基于闭包来实现的。 person函数中嵌套返回了子函数,并在其中使用了person函数接受到的 city变量

function person(city){ //闭包
   return function (school){
     return function(name){
        city+school+name;
     }
   }
}

let school=person("成都市")("成都七中"); 
school("小李");//成都市成都七中小李;

总结:

所以,柯里化是闭包应用的一种形式,或者说闭包是实现柯里化的基础。

偏函数

定义

说完了柯里化,再来说下偏函数。偏函数的使用方法和场景和柯里化相似,只是使用的方法更加灵活。 偏函数是把接受多个参数函数,变成先接受若干个参数的函数,再嵌套接受若干个参数的函数。形式上,不拘泥于柯里化的一定每次都只接受一个参数

举例:

function person(city,school){
     return function(name){
        city+school+name;
     }
}
let schoole=person("成都市","成都七中")

schoole("小李"); //成都市成都七中小李

可以看到,我们先传入city,school两个参数,再在需要时调用schoole() 传入name,并没有刻意遵循单入参 的规定,这就是偏函数 的使用方法。

总结:

所以,柯里化偏函数,都是运用了闭包的原理,让函数记住一部分参数,从而实现了实际开发中更简洁,合理的书写代码的目的。