定義
柯里化是一種將使用多個參數(shù)的一個函數(shù)轉(zhuǎn)換成一系列使用一個參數(shù)的函數(shù)的技術(shù)吁峻。
function sum(num1, num2) {
return num1 + num2;
}
// 執(zhí)行sum函數(shù) 栏渺,一次需傳入兩個參數(shù)
sum(1,2); //3
// 假設(shè)有一個curry函數(shù)做到柯里化
var sumCurry = curry(add);
addCurry(1)(2); // 3
柯里化用途
// ajax 示例
function ajax(type, url, data) {
var xhr = new XMLHttpRequest();
xhr.open(type, url, true);
xhr.send(data);
}
// 雖然 ajax 這個函數(shù)非常通用魄咕,但在重復(fù)調(diào)用的時候參數(shù)冗余
ajax('POST', 'https://www.test.com', "name=kevin");
ajax('POST', 'https://www.test2.com', "name=kevin");
ajax('POST', 'https://www.test3.com', "name=kevin");
//利用curry
var ajaxCurry = curry(ajax);
// 以發(fā)送Post請求為例
var post = ajaxCurry('POST');
post('www.test.com', "name=kevin");
// 以POST類型請求來自于 https://www.test.com 的數(shù)據(jù)
var postFromTest = post('https://www.test.com');
postFromTest("name=kevin");
- curry用途可以理解為: 參數(shù)復(fù)用胧弛,本質(zhì)上是降低通用性盘寡, 提升適用性楚殿。
例子二:
var arr = [{id:1, name: 'A'},{id:2, name: 'B'}];
// 獲取所有的name
var names = arr.map(item => {
return item.name; //這么寫為了突出 curry
})
如果柯里化
var prop = curry(function(k, item) {
return item[k];
})
var names = arr.map(prop('name'));
為了獲取name這么麻煩, 但其實prop 方法可針對大量業(yè)務(wù)場景竿痰,多次使用脆粥,而且增加了代碼的可讀性。
arr.map(prop('name')) 就好像直白的告訴你:arr 對象遍歷(map)獲取(prop) name 屬性影涉。
實現(xiàn) sum curry
function sum(num1, num2) {
return num1 + num2;
}
function curry(fn) {
var args = [].slice.call(arguments, 1);
return function () {
return fn.apply(this, args.concat([].slice.call(arguments)));
}
}
var sum1 = sum(1,2); //3
var sumCurry = curry(sum,1,2);
sumCurry(); //3
var sumCurry2 = curry(sum,1);
sumCurry2(2); // 3