浅谈函数式编程
函数式编程本质上是一种数学运算。因为是数学运算所以自然就会涉及到加减乘除等运算和交换律结合律同一律分配律等运算法则。如果要函数顺利的进行数学运算,就要求函数必须是纯的,不能有副作用,即纯函数。但如果只是简单的将纯函数用于复杂的加减乘除运算,则会写出一堆看起来杂乱无章的、不符合人类阅读习惯和编码直觉的代码。因此函数式编程需要借助组合函数、柯里化、递归、闭包和各种各样的高阶函数让代码看起来更符合人类的直觉和逻辑思维的方式。
再说一等公民
当我们在说函数是“一等公民”的时候,不要想当然的以为函数就是 js 世界里的老大了,我们实际上说的是它们和其他对象都一样:就是普通公民。
作为一等公民,函数可以被赋值给另外一个变量,然而编程中却有很多这样的神奇操作:
const hi = name => Hi, ${name}
const greeting = name => hi(name)
实际上调用 hi(‘girl’) 和 greeting(‘gril’) 的结果无论如何都是完全一样的,greeting 函数所作的不过是调用并返回 hi 函数而已。但实际上完全没必要如此脱裤子放屁多此一举,直接把 hi 函数赋值给 greeting 变量即可:
const hi = name => Hi, ${name}
const greeting = hi
懂了吗?那再看下下面这个:
// 太傻了
const getServerStuff = callback => ajaxCall(json => callback(json)) // ajaxCall 是外部封装好的接口函数
这么长的函数,看都看不懂,我们来简化下:
// 这行
ajaxCall(json => callback(json));
// 等价于这行
ajaxCall(callback);
// 那么,重构下 getServerStuff
const getServerStuff = callback => ajaxCall(callback);
// …就等于