函数式编程的几大核心(纯函数,高阶函数,函数柯里化,函数组合,声明式和非声明式命令,point free)

由于函数式编程具有代码质量高且易于维护的特点,其应用也越来越广泛。许多不支持函数式编程的语言也加入了闭包,匿名函数等函数式编程特性。

函数式编程(functional programming)定义:

将电脑运算视为数学上的函数计算,并且避免使用程序状态和易变对象,又称泛函编程。

函数式编程的几个核心概念:

纯函数,高阶函数,函数柯里化,函数组合,声明式和非声明式命令,point free(入参不用定义变量)

纯函数(输入一定时,输出一定):输出不受外部环境影响,同时也不影响外部环境,无副作用

函数柯里化:将一个低阶函数转化为高阶函数的过程

函数式编程的几大核心(纯函数,高阶函数,函数柯里化,函数组合,声明式和非声明式命令,point free)_第1张图片

柯里化是一种“预加载”函数的能力,通过传递一到两个参数调用函数,就能得到一个记住了这些参数的新函数

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

 

 

 

 

 

 

你可能感兴趣的:(js)