由于函数式编程具有代码质量高且易于维护的特点,其应用也越来越广泛。许多不支持函数式编程的语言也加入了闭包,匿名函数等函数式编程特性。
函数式编程(functional programming)定义:
将电脑运算视为数学上的函数计算,并且避免使用程序状态和易变对象,又称泛函编程。
函数式编程的几个核心概念:
纯函数,高阶函数,函数柯里化,函数组合,声明式和非声明式命令,point free(入参不用定义变量)
纯函数(输入一定时,输出一定):输出不受外部环境影响,同时也不影响外部环境,无副作用
函数柯里化:将一个低阶函数转化为高阶函数的过程
柯里化是一种“预加载”函数的能力,通过传递一到两个参数调用函数,就能得到一个记住了这些参数的新函数
var add = function(x) {
return function(y) {
return x + y;
};
};
//es6写法
var add = x => (y => x + y);
//试试看
var increment = add(1);
var addTen = add(10);
increment(2); // 3
addTen(2); // 12
高阶函数
高阶函数是一个函数,它接收函数作为参数或将函数作为输出返回
函数组合(compose)
//定义compose
var compose = (...args) => x => args.reduceRight((value, item) => item(value), x);
var toUpperCase = function(x) { return x.toUpperCase(); };
var exclaim = function(x) { return x + '!'; };
var shout = compose(exclaim, toUpperCase);
shout("send in the clowns");
//=> "SEND IN THE CLOWNS!"
声明式和命令式代码
命令式代码:命令“机器”如何去做事情(how),这样不管你想要的是什么(what),它都会按照你的命令实现。
声明式代码:告诉“机器”你想要的是什么(what),让机器想出如何去做(how)。(不依赖于外部环境)
// 命令式
var makes = [];
for (var i = 0; i < cars.length; i++) {
makes.push(cars[i].make);
}
// 声明式
var makes = cars.map(function(car){ return car.make; });
Point Free
永远不必说出你的数据
函数无须提及将要操作的数据是什么样的。一等公民的函数、柯里化(curry)以及组合协作起来非常有助于实现这种模式
注:什么是一等公民函数(头等函数):
在JavaScript中,你能对对象、字符串、数字类型做的操作,你同样能在函数上操作。就如你能将它们作为参数给函数,把它们赋值给变量然后传递它们等。这就是为什么在JavaScript中函数被视为头等函数
// 非 pointfree,因为提到了数据:word
var snakeCase = function (word) {
return word.toLowerCase().replace(/\s+/ig, '_');
};
// pointfree
var snakeCase = compose(replace(/\s+/ig, '_'), toLowerCase);
参考:https://www.cnblogs.com/fengyuqing/p/functional_programming_1.html