什么是函数式编程

什么是函数式编程,就是把函数本身上升到一等公民的地位,进行编程构建

为什么要学习函数式编程

为了更好的模块化(模块化使得开发更快、维护更容易,模块可以重用,模块化便于单元测试和debug)

掌握函数式编程有助于更好的理解和使用Rxjs、Redux等一些前端类库和框架

函数是一等公民

所谓一等公民,是指函数和其他数据类型拥有平等的地位

函数可以赋值给变量: 

    let sub = (x, y) => x + y;
    sub(10, 20);

函数可以被作为实参传递:

    let funA = (x, y) => x * y;
    let funB = (n, m) => n * m
    funB(funA(1, 2), 3)

函数可以被另一个函数返回

    let funC = (a, cb) => {
        return (c) => {
            cb();
            return c + 2
        }
    }
    function cb();


函数可以返回另一个函数

函数可以作为形

纯函数

纯函数:一个没有任何副什么用,并且返回值由输入决定的函数

一、非纯函数

    const add = n => n + 1;
    add(1);

二、纯函数

    function addPure( x ){
        return function ( y ) {
            return y + x
        }
    }
    addPure(10)(20);            // 30

函数柯里化

只传递函数的一部分参数来调用它,让它返回一个函数去处理剩下的参数

// 柯里化
function addPure(x){
    return function(y) {
        return y + x
    }
}

var addTemp = addPure(5)
var res = addTemp(1) // 6
var res1 = addTemp(10) // 15

// 非柯里化
function addPure(x, y){
    return y + x
}

// 柯里化结合ES6
const add = x => y => x + y

// redux middlreware
const loggerMiddleware = store => next => action => {
    // do some thing.
}

高阶函数

把函数当做其它函数的参数来传递

let sum = (x, y) => x+y;

let calculate = (fn, x, y) => fn(x,y);

calculate(sum, 1, 2)

compose 函数组合

将多个函数组合成一个函数

var compose = function(fn1, fn2) {
    return function(arg){
        return fn1(fn2(arg));
    }
}

var a = arg => arg + 'a';
var b = arg => arg + 'b';

var c = compose(a, b); // 将a,b函数进行组合
console.log(c('c'));  // => cba

判断数据类型

function isDataType(type){
    var typeName = '';

    switch(toString.call(type)){
        case '[object String]':
            return 'string';
            break;

        case '[object Number]':
            if(type.toString().indexOf('.') != -1){
                return 'float';
            }
            else{
                return 'number';
            }
            break;

        case '[object Array]':
            return 'array';
            break;

        case '[object Object]':
            return 'object';
            break;

        case '[object Undefined]':
            return 'undefined';
            break;

        case '[object Null]':
            return 'null';
            break;    

        default: break;
    }

    return typeName;
}

| https://github.com/GuoYongfeng/js-functional-program
| http://www.alloyteam.com/2016/09/talk-about-functional-programming/
| https://llh911001.gitbooks.io/mostly-adequate-guide-chinese/content/ch1.html