柯里化是什麼?有什麼優點?(以JavaScript為例)

柯里化(currying)用一句話解釋就是「將一個接受多個參數的函數轉換成多個只接受一個參數的函數」,柯里化不僅被用於 Javascript,也被用於其他程式語言。

柯里化的例子

簡單的使用一個例子來驗證這句話:

/* 普通函數 */
function sum(a, b) {
    return a + b;
}
/* 箭頭函數 */
sum = (a, b) => a + b;

console.log(sum(1, 2)); // 3

將之柯里化後變為:

/* 普通函數 */
function sum(a) {
    return function(b) {
        return a + b;
    }
}

/* 箭頭函數 */
// sum = (a) => (b) => a + b;

const a = sum(1)(2);
const b = (sum(1))(2);
console.log(a); // 3
console.log(b); // 3

從上面的例子我們可以很直觀的得知,柯里化會將一個函數從 sum(a, b) 轉換成 sum(a)(b),柯里化不會調用函數,只是對函數進行轉換。

柯里化的目的

一樣以算術題作為例子,假設今天我們需要輸出倍數 7 的乘法結果,如果沒有使用柯里化,我們會需要重複的將 7 作為參數給函數調用:

function multiplication(a, b) {
    return a * b;
}
var result1 = multiplication(7, 1); // 7
var result2 = multiplication(7, 2); // 14
var result3 = multiplication(7, 3); // 21
//...

先轉換為柯里化形式:

function multiplication(a) {
    return function (b) {
        return a * b;
    }
}
console.log(multiplication(7)(1)); // 7
console.log(multiplication(7)(2)); // 14
console.log(multiplication(7)(3)); // 21

我們還可以將固定的參數先存成一個變數再使用:

// 為了方便我直接用箭頭函數了...
multiplication = (a) => (b) => a * b;
let multi = multiplication(7);
console.log(multi(1)); // 7
console.log(multi(2)); // 14
console.log(multi(3)); // 21

由此可知柯里化的好處是可以拆分程式碼,將需要重複的部分賦予給變數,有利於重複使用。並且因為將原本的函數進行了拆分,所以程式碼的可讀性也會提高

0 0 評分數
Article Rating
訂閱
通知
guest

0 Comments
在線反饋
查看所有評論