1. 程式人生 > >JavaScript中的柯裏化

JavaScript中的柯裏化

基礎上 tps pow 開始 turn fix math rtp UNC

今天在博客園首頁看到一篇好文章 【譯】理解JavaScript中的柯裏化

加上最近工作中的一些感悟,算是對函數式編程語言(scala, python, javascrtpt)中的閉包,偏函數、柯裏化有了更進一步的認識。

之前學Scala被繞的雲裏霧裏的各種名詞,現在也開始慢慢理解了。

上面那篇文章寫的很好,這裏就只說一下自己實際用到的一個例子。


現在需要對流速進行轉換,流速的單位有 bps、Kbps、Mbps、Gbps、Tbps,從一個單位轉換到另一個單位需要除N次1000。

可能需要有從bps轉換到Gbps的,也可能有需要從Kbps轉換到Gbps的,按照普通的寫法就會很醜很雜。

這裏出現個除1000,那裏出現個除1000000,可讀性、維護性極差。

使用閉包就可以讓代碼變得優雅:

定義一個流速轉換函數:

function flowVelocityFormater(base, power) {
    return function(v) {
        return (v / Math.pow(base, power)).toFixed(2);
    }
}

在此基礎上,得到幾個基本的轉換函數:

var bps2Gbps = flowVelocityFormater(1000, 9);
var Kbps2Gbps =  flowVelocityFormater(1000, 6);

實際轉換時就可以使用

newValue = bps2Gbps(value);

語義簡潔清晰多了。

未來有一天,單位轉換需要按1024而不是1000轉換時,也只需要修改

bps2Gbps = flowVelocityFormater(1024, 9);

即可,或者定義一個新的函數。代碼的維護性大大增強。

函數式編程還是蠻爽的~~

JavaScript中的柯裏化