这篇文章给大家介绍怎么在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)