相对于面向对象编程(Object-oriented programming)关注的是数据而言,函数式编程关注的则是动作,其是一种过程抽象的思维,就是对当前的动作去进行抽象。

函数式编程的好处

  • 使代码更简洁,优雅
  • 便于后期的代码维护
  • 能够大大提升开发效率

函数式编程的特点

  • 函数是第一等公民
  • 函数是纯函数
    • 无副作用
    • 同输出同输入

无副作用即函数运行时内部的操作不会对外部产生影响

1
2
3
4
5
6
7
8
9
10
// 无副作用的纯函数
function addf(x,y){
return x + y;
}

//不是纯函数,调用了外部的不确定值,带有副作用,
var msg = 'hello world'
function print(){
return msg
}

将多个函数合并成一个函数运行

函数合成/高级函数(compose)

1
2
3
4
5
6
7
8
9
function addf(x,y){
return x + y;
}

function print(_msg){
return _msg;
}
//函数addf(1,2)是print函数的_msg参数
var msg = print(addf(1,2)) // =>3

高级函数的含义和函数合成大同小异,高级函数值的是使用函数作为其参数之一


函数柯里化 (Curry)

函数柯里化的函数只接受一个单一的参数返回接受余下的参数而且返回结果的新函数

1
2
3
4
5
6
7
8
9
10
function addf(x){
//向控制台打印x
console.log(x);
//箭头函数
return (y)=>{
//向控制台打印y
console.log(y);
return x + y;
}
}

在控制台上运行addf(1)(2),将会得到下图

>


函子

1
2
3
4
5
6
7
8
9
10
function print(_msg){
let _msg = '[print]'+_msg;
return _msg
}

function stringMap(mapperFn,str) {
return [...str].map( mapperFn ).join( "" );
}

stringMap(print,'hello world')

stringMap(..) 允许字符串作为函子 你可以定义一个映射函数用于任何数据类型。只要实用函数满足这些规则,该数据结构就是一个函子



函数式编程

本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!