JavaScript一個(gè)有趣的特征是函數(shù)可以作為參數(shù)和返回值空盼,在計(jì)算機(jī)科學(xué)中丰涉,柯里化(Currying)是把接受多個(gè)參數(shù)的函數(shù)變換成接受一個(gè)單一參數(shù)(最初函數(shù)的第一個(gè)參數(shù))的函數(shù),并且返回接受余下的參數(shù)且返回結(jié)果的新函數(shù)的技術(shù)。
- 說(shuō)白了,就是柯里化時(shí)先傳進(jìn)一部分參數(shù)屎债,然后返回調(diào)整后的函數(shù)。
- 直接上代碼垢油,看看柯里化到底干了什么
function curry(fn){
let args = Array.prototype.slice.call(arguments,1);
return function(){
let innerArgs = Array.prototype.slice.call(arguments);
let finallArgs = args.concat(innerArgs);
return fn.apply(null,finallArgs);
};
}
function sum(a,b,c){
return a + b + c;
}
curry(sum,1);
- 調(diào)用curry(sum,1)發(fā)生了什么盆驹?
function sum(1,b,c){
return 1 + b + c;
}
- 同理玖瘸,我們可以推出curry(sum,1,2)的結(jié)果
function sum(1,2,c){
return 1 + 2 + c;
}
- 調(diào)用上面兩個(gè)新函數(shù)
console.log(curry(sum,1)(2,3));// 6
console.log(curry(sum,1,2)(3));// 6
總結(jié):柯里化是一個(gè)部分求值的過(guò)程秸讹。
function curry(fn,...args1){
return (...args2)=>{
return fn.apply(null,[...args1,...args2]);
}
}