JavaScript偏函数与柯里化实例详解偏函数与柯里化实例详解
本文实例讲述了JavaScript偏函数与柯里化。分享给大家供大家参考,具体如下:
到目前为止我们仅讨论绑定this,现在让我们更深入学习。
我们不仅能绑定this,也可以是参数,这较少使用,但有时很方便。
bind完整的语法为:
let bound = func.bind(context, arg1, arg2, ...);
可以绑定上下文this和函数的初始参数。举例,我们有个乘法函数mul(a,b):
function mul(a, b) {
return a * b;
}
我们可以在该函数的基础上使用绑定创建一个double函数:
let double = mul.bind(null, 2);
alert( double(3) ); // = mul(2, 3) = 6
alert( double(4) ); // = mul(2, 4) = 8
alert( double(5) ); // = mul(2, 5) = 10
调用mul.bind(null, 2)创建新函数double,传递调用mul函数,固定第一个参数上下文为null,第二个参数为2,多个参数传递也是如
此。
这称为偏函数应用——我们创造一个新函数,让现有的一些参数值固定。
注意,这里确实不用this,但bind需要,所以必须使用null。
在下面代码中函数triple实现乘以3的功能:
let triple = mul.bind(null, 3);
alert( triple(3) ); // = mul(3, 3) = 9
alert( triple(4) ); // = mul(3, 4) = 12
alert( triple(5) ); // = mul(3, 5) = 15
为什么我们通常使用偏函数?
这里我们偏函数的好处是:通过创建一个名称易懂的独立函数(double,triple),调用是无需每次传入第一个参数,因为第
一个参数通过bind提供了固定值。
另一种使用偏函数情况是,当我们有一个很通用的函数,为了方便提供一个较常用的变体。
举例,我们有一个函数send(from, to, text),那么使用偏函数可以创建一个从当前用户发送的变体:sendTo(to, text)
使用没有上下文的偏函数使用没有上下文的偏函数
如果想固定一些参数,但不绑定this呢?
内置的bind不允许这样,我们不能忽略上下文并跳转到参数。幸运的是,可以仅绑定参数partial函数容易实现。
如下:
function partial(func, ...argsBound) {
return function(...args) { // (*)
return func.call(this, ...argsBound, ...args);
}
}
// Usage:
let user = {
firstName: "John",
say(time, phrase) {
alert(`[${time}] ${this.firstName}: ${phrase}!`);
}
};
// add a partial method that says something now by fixing the first argument
user.sayNow = partial(user.say, new Date().getHours() + ':' + new Date().getMinutes());
user.sayNow("Hello");
// Something like: