怎么在JavaScript中实现偏函数与柯里化

  介绍

这篇文章给大家介绍怎么在JavaScript中实现偏函数与柯里化,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

绑定完整的语法为:

let  bound =, func.bind (__arg1、上下文,还以为,最长,…),

可以绑定上下文这个和<代码>函数的初始参数。举例,我们有个乘法函数<代码> mul (a, b) :

function  mul (a, b), {   ,return  a  *, b;   }

我们可以在该函数的基础上使用绑定创建一个<代码> 两倍函数:

let  double =, mul.bind (null,, 2);   警报(,双(3)),,//,=,mul (2, 3),=6   alert(),双(4),,//,=,mul (2, 4),=8   警报(,双(5)),,//,=,mul (2), 5), 10=,

调用<代码> mul。绑定(null, 2) 创建新函数<代码>双> mul 函数,固定第一个参数上下文为null,第二个参数为2,多个参数传递也是如此。

这称为偏函数应用,我们创造一个新函数,让现有的一些参数值固定。

注意,这里确实不用这个,但结合需要,所以必须使用null。

在下面代码中函数<代码> 3 实现乘以3的功能:

let  triple =, mul.bind(零,3);   alert(),三(3),,//,=,mul (3, 3),=9   alert(),三(4),,//,=,mul (3, 4),=12   alert(),三(5),,//,=,mul (3, 5),=,

15为什么我们通常使用偏函数?

这里我们偏函数的好处是:通过创建一个名称易懂的独立函数(两倍,三倍),调用是无需每次传入第一个参数,因为第一个参数通过绑定提供了固定值。

另一种使用偏函数情况是,当我们有一个很通用的函数,为了方便提供一个较常用的变体。

举例,我们有一个函数<代码>发送(,,文本)> sendTo(文本),

<强>使用没有上下文的偏函数

如果想固定一些参数,但不绑定这个呢?

内置的<代码> 绑定不允许这样,我们不能忽略上下文并跳转到参数。幸运的是,可以仅绑定参数<代码>部分函数容易实现。

如下:

function 部分(func,…argsBound), {   ,return 函数(…args), {,//(*)   return 才能;func.call (,,……argsBound,,…args);   ,}   }//,用法:   let  user =, {   ,firstName:“John",   ,说(时间,,短语),{   警报才能(“[${时间}],$ {this.firstName}:, ${短语}!”);   ,}   };//,add  a  partial  method  that  says  something 你by  fixing 从而first 争论   时间=user.sayNow 部分(user.say, new 日期().getHours (), +, & # 39;: & # 39;, +, new 日期().getMinutes ());   user.sayNow (“Hello");//,Something 如:   [10]//,,你好,,约翰!

调用<代码>部分(func [__arg1,最长…])函数的结果为调用<代码> func> <李>

这一致(因为<代码> user.sayNow> 调用户用的)

<李>

然后给其…garsBound——部分使用该参数(“10:00")进行调用。

<李>

然后提供参数…空对空导弹,提供给包装器的参数(“Hello”)

所以使用传播运算符很容易实现,是吗?

loadash库也提供了-.partial实现。

<强>柯里化

有时人们混淆上面提及的偏函数和另一个名称为“柯里化”函数功能,柯里化是另一个有趣的处理函数技术,这里我们必须要涉及。

柯里化(局部套用):转换一个调用函数<代码> f (a, b, c) 为<代码> f (a) (b) (c) 方式调用。

让我们实现柯里化函数,执行一个两元参数函数,即转换<代码> f (a, b) 至<代码> f (a) (b) :

function 咖喱(函数),{   ,return 函数(a), {   return 才能;函数(b), {   ,,return  func (a, b);   ,,};   ,};   }//使用   function 和(a, b), {   ,return  a  +, b;   }   let  carriedSum =,咖喱(总和);   alert (, carriedSum (1) (2),),,//, 3

上面是通过一系列包装器实现的。

<李>

<代码>咖喱(函数)的结果是<代码>函数(a)> <李>

当调用<代码>(1)是求和,参数被保存在词法环境中,然后返回新的包装器<代码>函数(b)

<李>

然后<代码>(1)和(2)

怎么在JavaScript中实现偏函数与柯里化