最近 ken 抽奖中了本书,有幸读到了这本神作《Javascript 函数式编程》。 从第一章的晦涩难懂到最后一章的豁然开朗,真是少有的技术类书籍阅读体验,不枉这么费劲地看了这么久。

之前在项目里面也是有用过 underscore 的,只不过更多的是把它当成一个前端模板编译工具而已, 也没有想过一个这么小巧的库包含着这么有趣而强大的思路。

函数是一等公民

函数是一等公民。 函数是唯一的一等公民!

函数式编程的第一个概念,也是我刚开始完全跟不上作者节奏的罪魁祸首。 前半句不难理解,Javascript 对于函数的支持,基本上和基本类型没什么区别了,没什么不能去的地方, 但后半句直到快把书看完才勉强能接受,反正第一次看到下面这个函数的时候,我内心是崩溃的。

function always (n) {
    return n;
}

函数式

和我之前常用的,面向对象,或者是指令式编程不同,函数式编程,将函数作为基本的行为单元。 关注的不是预先设定好细节的对象,而是数据在函数中的加工和传递,更形象一点的说法应该是在加工管道中的流动。 always 就是其中最简单的一个,数据从一边流入(arg),从另一边流出(return),不做进行任何处理。

函数的纯度

纯函数的概念,就是函数除了返回值之外没有其他的副作用。 追求纯度的目的,是为了限制每个操作的影响范围,避免陷入复杂的状态变化之中。 书中对纯度的追求非常执着,就平时运用来说,多少有点太激进了。

引用透明

引用透明是函数纯度带来的好处,可以说函数式编程的灵活性主要来源于此。 只关心数据流动过程中的环节,而不是预先确定数据的结构,跟 OO 常用的拆解方式差别挺大的,不过倒是很容易接受。

柯里化

柯里化应该算是构建高阶函数的最简单方法之一了,是函数由通用到具体的一种过程。 为了保持函数的纯度,函数中是不应该有状态的存在的,那变化就只能通过参数来体现了。 通过柯里化,就可以把过多的参数给处理掉,不至于函数调用时都要写一大串。

画风不同,也没什么不好的

写码的时候尝试了一下新的风格,果然在洗数据的时候,看起来逼格高了好几个档次(— —)/, 十分欣慰