本文转载于:猿2048网站➣

定义

函数式编程(英语:functional programming)或称函数程序设计,又称泛函编程,是一种编程典范,它将计算机运算视为数学上的函数计算,并且避免使用程序状态以及易变对象

什么是数学函数

初中数学中定义

设在一个变化过程中有两个变量x与y,如果对于x的每一个值,y都有唯一的值与它对应,那么就说x是自变量,y是x的函数.

第一个图片每一个x 对应唯一一个y 值,此为函数第二张图片x=5对应 多个y的值,所以此不为函数

举例来说,现在有这样一个数学表达式: (1 + 2) \* 3 - 4

传统的过程式编程,可能这样写:

 var a = 1 + 2;
 var b = a \* 3;
 var c = b - 4;

函数式编程要求使用函数,我们可以把运算过程定义为不同的函数,然后写成下面这样:

var result = subtract(multiply(add(1,2), 3), 4);

函数风格的编程特点

  1. 纯函数,没有副作用

  2. 引用透明

  3. 不修改状态

  4. 声明式与命令式

  5. 函数是第一等公民

纯函数,没有副作用

在Javascript中对于数组的操作,有些是纯的,有些就不是纯的。

下面来举个栗子:

var arr = [1,2,3,4,5];
 arr.slice(0,3); //=\> [1,2,3]
 arr.slice(0,3); //=\> [1,2,3]

Array.slice是纯函数,因为它没有副作用,对于固定的输入,输出总是固定的

var arr = [1,2,3,4,5];
 arr.splice(0,3); //=\> [1,2,3]
 arr.splice(0,3); //=\> [4,5]
 arr.splice(0,3); //=\> []

Array.splice是不纯的,它有副作用,对于固定的输入,输出不是固定的

函数式编程强调没有“副作用”,意味着函数要保持独立,所有功能就是返回一个新的值,没有其他行为,尤其是不得修改外部变量的值,即一个函数调用 n 次后依然返回同样的结果。

var a = 1;
 // 含有副作用,它修改了外部变量 a, 多次调用结果不一样
 function test1() {
  a++
  return a;
 }
 // 无副作用,没有修改外部状态, 多次调用结果一样
 function test2(a) {
  return a + 1;
 }

引用透明

指一个函数只会用到传递给它的变量以及自己内部创建的变量,不会使用到其他变量。

 var a = 1;
 var b = 2;
 // 函数内部使用的变量并不属于它的作用域
 function test1() {
 return a + b;
 }
 // 函数内部使用的变量是显式传递进去的
 function test2(a, b) {
 return a + b;
 }

不修改状态

在其他类型的语言中,变量往往用来保存"状态"。而函数式编程只是返回新的值,不修改系统变量,即是无破坏性的数据转换。

//修改状态

function addElement(y) {
 var x = [1, 2];
 x.push(y)
 console.log(x)
 return x;
 }
 addElement(3) // x-\>[1,2,3]

//不修改状态

function addElement(y) {
 var x = [1, 2];
 var z = x.slice(0);
 z.push(y)
 console.log(x)
 return z;
 }
 addElement(3)

声明式与命令式

•命令式:程序花费大量代码来描述用来达成期望结果的特定步骤,即"How to do"

•声明式:程序抽象了控制流过程,花费大量代码描述的是数据流,即"What to do"

以做蔬菜沙拉举例

  • 声明式: 蔬菜.做成菜(蔬菜沙拉)

  • 命令式: 洗干净(蔬菜)混合(蔬菜, 沙拉)放入盘中(混合物)

举一些栗子

01-08 20:41
查看更多