本文转载于:猿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);
函数风格的编程特点
纯函数,没有副作用
引用透明
不修改状态
声明式与命令式
函数是第一等公民
纯函数,没有副作用
在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"
以做蔬菜沙拉举例
声明式: 蔬菜.做成菜(蔬菜沙拉)
命令式: 洗干净(蔬菜)混合(蔬菜, 沙拉)放入盘中(混合物)
举一些栗子