一。柯里化(curry )的 的概念很简单:只传递给函数一部分参数来调用它,让它返回一个函数去处理剩下的参数。
二。具有通用性和高适用。
三。常见作用:1、参数复用。2、提前返回。3、 延迟计算/运行
四。实例。
(1)参数复用:
function add(a) {
return function (b) {
return function (c) {
return a + b + c
}
}
}
let add1 = add(1)
console.log(add1(2)(3)) // 6
console.log(add1(4)(5)) // 10
let add2 = add1(2)
console.log(add2(4)) // 7
console.log(add2(5)) // 8
如上面代码里面的add1就是复用参数:1,而add2则复用了参数:1和2两个参数。
(2)提前返回。
var addEvent = (function(){
if (window.addEventListener) {
return function(el, sType, fn, capture) {
el.addEventListener(sType, function(e) {
fn.call(el, e);
}, (capture));
};
} else if (window.attachEvent) {
return function(el, sType, fn, capture) {
el.attachEvent("on" + sType, function(e) {
fn.call(el, e);
});
};
}
})();
addEvent('span', 'click', function () {}, false)
addEvent('div', 'click', function () {}, false)
addEvent('p', 'click', function () {}, false)
addEvent('div', 'dblclick', function () {}, false)
如上面代码对于监听事件的判断则只会走一次,如果是传统函数则会多次执行。则真是提前返回的好处。
(3)延迟计算/运行
let allScore = 0
let curryScore = function (fn) {
let allScore = []
return function () {
if (arguments.length === 0) {
return fn.apply(null, allScore)
} else {
allScore = allScore.concat([].slice.call(arguments))
}
}
}
let curryAddScore = curryScore(function (...val) {
for (let i = 0; i < val.length; i++) {
allScore += val[i]
}
})
curryAddScore(2)
curryAddScore(3)
curryAddScore(1)
console.log(allScore)
curryAddScore(3)
curryAddScore()
console.log(allScore)
如上面代码只有在参数传递完成时才会进行统计。这就是延迟计算/运行的结果