什么是函数式编程
什么是函数式编程,就是把函数本身上升到一等公民的地位,进行编程构建
为什么要学习函数式编程
为了更好的模块化(模块化使得开发更快、维护更容易,模块可以重用,模块化便于单元测试和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