柯里化是一個函數的運用技術,不只是JavaScript裡面,它可以運用在很多的地方,簡單來說就是幫忙做了轉換。

原本的函式可能是長這樣的:

1
fnc(A, B, C);

柯里化後會變成這樣:

1
fnc(A)(B)(C);

這兩種方式最後出來的結果都是會一樣的,而怎麼實現的等等就會提到,
今天會從幾個角度介紹這個主題 =>

  • 介紹與原理
  • 目的與好處

介紹與原理

柯里化主要的用途是用來簡化呼叫函式的過程,像是說把呼叫 f(a,b)變成呼叫 f(a)以及 f(b),
就可以達成說,把一個很多參數的函式,切分成很多只有一個參數的函式。

舉例來說:
這是一個簡單的相加,它是一個有很多參數的函式。

1
2
3
4
5
function plus(a, b, c) {
return a + b + c;
}

console.log(plus(1, 2, 3)); //印出6

使用柯里化的方式改寫,讓它變成很多只有一個參數的函式。

1
2
3
4
5
6
7
8
9
10
function plus(a) {
return function (b) {
return function (c) {
return a + b + c;
};
};
}

// 一次性的呼叫多個
console.log(plus(1)(2)(3)); //印出6

使用柯里化的方式後,可以一次性的呼叫多個,也可以讓最後只呼叫一個參數

1
2
3
4
5
6
7
8
9
10
11
function plus(a) {
return function (b) {
return function (c) {
return a + b + c;
};
};
}
let plusThree = plus(1)(2);

//最後呼叫裡面只放一個參數
console.log(plusThree(3)); //印出6

其實最主要的概念就是這樣而已,這邊要記得兩件事情

  • 柯里化不會去呼叫函式,只會對函式進行轉換
  • 柯里化一次只會接受一個參數

而柯里化其實是藉由把函式當作參數,帶到另一個參數之中,讓傳遞到的最後一個函式回傳之前所有的結果。

目的與好處

可以用來拆分程式碼,把比較重要的部分給保留,固定住一部分,只要改另外一部分就好,不用每次都全部寫出來。

比如說如果兩個數字需要相乘:

1
2
3
function multiply(a, b) {
return a * b;
}

每次都需要填入兩個參數,但如果今天假如第一個數字是固定時,使用柯里化的方式就能夠,只填入一個參數達到相同的效果。

1
2
3
4
5
6
7
8
9
10
11
12
13
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

不僅是減少重複的寫入,提高複用性,整體看起來的可讀性也會跟著上升。

同時也代表著不用在想著要傳入多少參數,一次就只要專心地傳遞一個,出現錯誤時可以更好的找出問題所在,那麼今天就介紹到這邊,明天見~

reference

[1] Currying - Wikipedia
[2] Currying
[3] Currying in JavaScript(柯里化)