本文实例讲述了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) = 6alert( double(4) ); // = mul(2, 4) = 8alert( 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) = 9alert( triple(4) ); // = mul(3, 4) = 12alert( 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 argumentuser.sayNow = partial(user.say, new Date().getHours() + ':' + new Date().getMinutes());user.sayNow("Hello");// Something like:// [10:00] Hello, John!
调用partial(func[, arg1, arg2...])
函数的结果为调用func
的包装器(*号行):
新闻热点
疑难解答
图片精选