JavaScript中的柯里化

Posted 编程柚子

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaScript中的柯里化相关的知识,希望对你有一定的参考价值。

今天在博客园首页看到一篇好文章 【译】理解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中的柯里化的主要内容,如果未能解决你的问题,请参考以下文章

翻译JavaScript 中的函数式编程:函数组合与柯里化

JS柯里化

JavaScript函数柯里化的一些思考

JavaScript函数式编程(纯函数柯里化以及组合函数)

JavaScript函数的柯里化(currying)

带你看懂javascript函数柯里化(currying)