柯里化是一個函數的運用技術,不只是JavaScript
裡面,它可以運用在很多的地方,簡單來說就是幫忙做了轉換。
原本的函式可能是長這樣的:
fnc(A,B,C);
柯里化後會變成這樣:
fnc(A)(B)(C);
這兩種方式最後出來的結果都是會一樣的,而怎麼實現的等等就會提到,
今天會從幾個角度介紹這個主題 =>
柯里化主要的用途是用來簡化呼叫函式的過程,像是說把呼叫f(a,b)變成呼叫f(a)以及f(b),
就可以達成說,把一個很多參數的函式,切分成很多只有一個參數的函式。
舉例來說:
這是一個簡單的相加,它是一個有很多參數的函式。
function plus(a, b, c) {
return a + b + c;
}
console.log(plus(1, 2, 3)); //印出6
使用柯里化的方式改寫,讓它變成很多只有一個參數的函式。
function plus(a) {
return function (b) {
return function (c) {
return a + b + c;
};
};
}
// 一次性的呼叫多個
console.log(plus(1)(2)(3)); //印出6
使用柯里化的方式後,可以一次性的呼叫多個,也可以讓最後只呼叫一個參數
function plus(a) {
return function (b) {
return function (c) {
return a + b + c;
};
};
}
let plusThree = plus(1)(2);
//最後呼叫裡面只放一個參數
console.log(plusThree(3));//印出6
其實最主要的概念就是這樣而已,這邊要記得兩件事情
而柯里化其實是藉由把函式當作參數,帶到另一個參數之中,讓傳遞到的最後一個函式回傳之前所有的結果。
可以用來拆分程式碼,把比較重要的部分給保留,固定住一部分,只要改另外一部分就好,不用每次都全部寫出來。
比如說如果兩個數字需要相乘:
function multiply(a, b) {
return a * b;
}
每次都需要填入兩個參數,但如果今天假如第一個數字是固定時,使用柯里化的方式就能夠,只填入一個參數達到相同的效果。
const multiply = (num) => {
return (x) => {
return num * x;
};
};
const multiplyByTwo = multiply(10);
console.log(multiplyByTwo(1)); //10
console.log(multiplyByTwo(2)); //20
console.log(multiplyByTwo(3)); //30
console.log(multiplyByTwo(4)); //40
console.log(multiplyByTwo(5)); //50
不僅是減少重複的寫入,提高複用性,整體看起來的可讀性也會跟著上升。
同時也代表著不用在想著要傳入多少參數,一次就只要專心地傳遞一個,出現錯誤時可以更好的找出問題所在,那麼今天就介紹到這邊,明天見~
[1] Currying - Wikipedia
[2] Currying
[3] Currying in JavaScript(柯里化)