JavaScript与函数式编程解释

2019-06-02 21:22:31王冬梅

                {
                return this.length ? [closure(this[0])].concat(this.slice(1).each(closure)) : [];
                }

这真是个神奇的魔法代码,它充分发挥了函数式的魅力,在整个代码中只有函数(function)和符号(Symbol)。它形式简洁并且威力无穷。
[1,2,3,4].each(function(x){return x * 2})得到[2,4,6,8],而[1,2,3,4].each(function(x){return x-1})得到[0,1,2,3]。

函数式和面向对象的本质都是“道法自然”。如果说,面向对象是一种真实世界的模拟的话,那么函数式就是数学世界的模拟,从某种意义上说,它的抽象程度比面向对象更高,因为数学系统本来就具有自然界所无法比拟的抽象性。

函数式编程第二定律:闭包是函数式编程的挚友。

闭包,在前面的章节中我们已经解释过了,它对于函数式编程非常重要。它最大的特点是不需要通过传递变量(符号)的方式就可以从内层直接访问外层的环境,这为多重嵌套下的函数式程序带来了极大的便利性,下面是一个例子:

(function outerFun(x)
{
        return function innerFun(y)
        {
                return x * y;
        }
})(2)(3);

函数式编程第三定律:函数可以被科里化(Currying)。

什么是Currying? 它是一个有趣的概念。还是从数学开始:我们说,考虑一个三维空间方程 F(x, y, z) = 0,如果我们限定z = 0,于是得到 F(x, y, 0) = 0 记为 F'(x, y)。这里F'显然是一个新的方程式,它代表三维空间曲线F(x, y, z)在z = 0平面上的两维投影。记y = f(x, z), 令z = 0, 得到 y = f(x, 0),记为 y = f'(x), 我们说函数f'是f的一个Currying解。
下面给出了JavaScript的Currying的例子:
function add(x, y)
{
        if(x!=null && y!=null) return x + y;
                else if(x!=null && y==null) return function(y)
                {
                return x + y;