柯里化,可以理解为逐渐接收部分参数,最后再一起求值的过程。
比如计算一些天一共工作的时间,可以每天将时间相加:
var num = 0
function addTime(val = 0) {
return num += val
}
这样每次累加当然没问题,但数据量很大的话会耗费很多性能
可以每天记录时间,最后再累加
let addTime = (function addTime() {
let args = [];
return function () {
if(arguments.length === 0) {
return args.reduce(function (total, num) {
return total + num
})
}else {
args.push(...Array.from(arguments))
}
}
})()
addTime(3.5); // 第一天
addTime(4.5); // 第二天
addTime(2.1); // 第三天
console.log(addTime())
传入参数时,先不计算;最后参数为空时再累加计算
反柯里化:当某个对象想调用某个方法时,不用在意这个对象在设计时是否拥有这个方法,只要对象适用于这个方法,就可以对这个对象调用它;即非我之物为我所用。
Function.prototype.uncurring = function() {
var self = this;
return function() {
var obj = Array.prototype.shift.call(arguments);
return self.apply(obj, arguments);
};
};
let push = Array.prototype.push.uncurring()
function argPush(val) {
push(arguments, 4)
return arguments //[3, 4]
}
argPush(3)
这样arguments就有了push方法,不需要考虑arg是否有push方法,只要认为arg应该有,那么就可以用。