什么是函数柯里化?
是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术。
它的重要意义在于可以把函数完全变成「接受一个参数;返回一个值」的固定形式,这样对于讨论和优化会更加方便。
简单的例子
function add(){
let arr = Array.prototype.slice.call(arguments)
function _add(){
let _arr = Array.prototype.slice.call(arguments)
arr = arr.concat(_arr)
return _add
}
_add.toString = function(){
let count = 0;
for(let i = 0; i < arr.length; i++){
count += arr[i]
}
return count
}
return _add
}
add(12)(1)(3,6).toString() //22
通用的例子
function currying(fn){
let _curry = function(){
let arr = Array.prototype.slice.call(arguments);
return function(){
let _arr = Array.prototype.slice.call(arguments);
arr = arr.concat(_arr)
if(arr.length < fn.length){
return _curry.apply(null, arr)
}else{
return fn.apply(null, arr)
}
}
}
return _curry
}
function example(a,b,c){
return a+b+c;
}
let curriedAdd = currying(example);
console.log(curriedAdd(1)(2)(3)); // 6
console.log(curriedAdd(1)(2,3));//6
可以看出通用例子是在简单例子外部又包了一层用于接收函数fn,下面的_curry 相当于上面的add