理解柯里化

weixin_34290000發表於2018-11-20

JavaScript函式柯里化,我們直接來看一段普通的程式碼:

function (a, b, c) {
    return a * b * c;
}

上面這個函式很簡答, 就是對傳入的a、b、c引數進行了計算,現在我們改成柯里化的形式:

// 柯里化的形式
function curry(a) {
    return (a) => {
        return (b) => {
            return a * b * c;
        }
    }
}

你會發現,將普通函式改成柯里化的形式無非就是巢狀返回多個函式,我們在呼叫的時候,只需要這樣呼叫:

// 呼叫柯里化函式
const num1 = curry(1)(2)(3); // 6
// 或者
const num2 = curry(1);
const num2_total = num2(2)(3); // 6 

呼叫也很簡單,無非就是將返回返回的函式在執行一下。

這裡由於閉包的原因,返回的函式仍然可以拿到(引用)上一個傳遞的引數。

柯里化的應用場景

任何一段程式碼,如果沒有應用場景,將毫無價值。

這裡,前面雖然我們簡單的理解了柯里化,但是有哪些場景呢?為什麼需要把原本很簡單的函式題包裝成巢狀多層的函式?

我們考慮下這樣的場景:

我們在淘寶上售賣一件商品,原價200元,在十月一號國慶節這一天,我們需要促銷打8折售賣,而在雙十一這一天,我們需要打5折售賣,此時,我們就需要計算打折後的售賣價格。

這裡,我們先來看普通的編寫方式:

// 封裝一個計算函式
function countPrice(price, discount) {
    return price * discount;
}
const price1 = countPrice(200, 0.8); // 國慶節促銷價格
const price2 = countPrice(200, .05); //雙十一促銷價格

上面程式碼很容易理解,我們定義了一個接受兩個引數(arity)的函式,分別來計算國慶節和雙十一的促銷價格。

沒毛病嗎?

上面程式碼沒毛病,但是仔細一想,price引數沒必要每次都傳啊,如果我們每個月甚至每天都有打折促銷,豈不是要寫很多,要傳遞很多price引數。

如果我們改成柯里化的形式:

// 柯里化的形式
function countPrice(price) {
    return (discount) => {
        return price * discount;
    }
}
const price = countPrice(200);
const price_total1 = price(0.8); // 國慶節價格
const price_total2 = price(0.5); // 雙十一價格
const price_total3 = price(0.7); // 雙十二價格
const price_total2 = price(0.8); // 元旦價格

這裡,我們通過柯里化的形式,省去了頻繁傳遞的引數,這就是柯里化的作用, 可以更輕鬆的重用和配置。

總結

柯里化優點:

  • 更輕鬆的配置和重用程式碼;
  • 避免頻繁的傳遞重複的引數。

相關文章