概念
函数式编程是一种思想,一种编程范式,需要多写才能体会。
特性
纯函数
相同的输入 肯定得到相同的输出 不依赖外部状态
var arr = [ 1, 2, 3, 4, 5 ]
arr.slice( 0, 3 ) //[0,1,2]
arr.slice( 0, 3 ) //[0,1,2]
var arr1 = [ 1, 2, 3, 4, 5 ]
arr1.push( 1 ); //6 push方法 向数组末尾添加一个元素,并返回新的长度
arr1.push( 1 ); //7
//slice 方法 相同的输入总是得到相同的输出 是纯函数 相反 push不是纯函数
柯里化
传递给函数比部分参数调用他 返回值去处理剩下的参数,每次只能输入一个参数
//柯里化 刚开始传递一部分参数调用函数(checkage(18)) 然后让其在返回一个新的函数(checkage18)去处理剩下的参数(checkage18(20))
var cheakage = min => ( age => age => min )
var checkage = function ( min ) {
return function ( age ) {
return min > age;
}
}
var checkage18 = checkage( 18 ); //产生了闭包 实质
checkage18( 20 ) //返回值 false
函数组合
一个值经过多个函数编程另外一个值 可以把中间的函数合并为一个函数 解决函数嵌套的问题
///函数组合 柯里化 每次传入一个参数 当参数越来越多 里面嵌套函数 越来越多. 解决函数嵌套的问题
var compose = function(f,g){
return function(x){
f(g(x))
}
}
惰性求值
function getName(){
var a = 1;
console.log(22)
getName = function(){
console.log(2222)
return a;
}
return a;
}
console.log(getName)//1
console.log(getName)//1
//具体请看js的执行过程
高阶函数
函数当做参数 把传入的函数作为一个封装,然后返回封装函数 达到更高层次的抽象
function add(a,b){
return a+b;
}
function sum(add,array){
return add(array[0],array[1]);
}
sum(add,[1,2])
尾调用优化
递归需要保存大量的调用记录,容易发生栈溢出错误,尾递归将递归变为循环只需要保存一个调用记录,不会发生溢出内存的错误。
具体作用优点可以参考阮一峰es6 函数拓展
//尾调用优化 最为显著的是尾递归
function factorial(n,total){
if(n===1) {
return n+total
}else {
return factorial(n-1,n+total);
}
}
console.log(factorial(5,0));
闭包
函数式编程几乎都涉及闭包,函数在自身定义所在的作用域位置以外执行就形成闭包。