什么是函数式编程?
英文的叫法是:Functional programming。函数式编程是一种编程的范式,也可以称作一种编程方式的方法论。
常见的编程范式(或者方法论),也有我面向对象编程,英文叫法是 Object-oriented programming 。
函数式编程的关注点在函数上,而面向对象编程的关注点在对象上。
函数式编程,针对的是一个函数的输入和输出。输入指的是这个函数的参数,而输出是这个函数的返回值。其中,函数本身,可以作为“数据“被传递给另一个函数的参数中;而且函数也可以作为一个返回值来输出。
面向对象编程,针对的是对象,而函数在面向对象中,函数也是作为对象的方法而存在,即函数是对象的函数,也是对象的一种“属性“。
函数式编程的优点
1、开发速度快、易于复用。
使用函数进行功能的封装,在使用的时候,通过调用函数的方式,能够很大程度上提高了代码的复用性以及开发效率。当然,这是针对面向过程的c而言的。从复用性的角度来说,个人更倾向于面向对象的编程方式。
2、便于理解,接近自然语言的逻辑。
和面向对象的编程相比,函数式编程不需要深层次的抽象、分离。它的调用关系更显得清晰。所以理解起来更贴近自然语言,显得更简单一点。
3、易于并发编程
面向对象的方式一个比较难搞的点就死并发控制。你必须要担心的一点就是,某个线程的运行会不会改变系统状态,而这个系统状态偏偏是另一个线程中使用到的。但是函数式编程中就不需要关注这个问题。因为函数式编程只关注自身的输入与输出,它不会出现面向对象的“死锁问题”。
函数式编程存在的缺点
由于是函数式编程,在代码的运行过程中,会产生许多的变量来占用内存,这也是函数式编程自身最大的问题所在。函数式编程相比于面向对象编程,不太适合做大型项目的开发。
JavaScript中的柯里化
如果一个函数可以接受多个参数,将这个函数转化为每次只接收一部分参数的函数的多次调用形式,就是柯里化。
function add(a,b,c){
return a+b+c;
}
function addOne(a){
return function(b){
return function(c){
return a+b+c;
}
}
}
add(1,2,3);//return 6;
add(1)(2)(3);//return 6;
这个就是柯里化。
柯里化的使用场景:
场景一:性能优化。
var addEvent = function(el,type,fn,captrue){
if(window.addEventListener){
el.addEventListener(type,function(e){
fn.call(el,e);
},captrue)
}else if(window.attachEvent){
el.attach("on"+type,function(e){
fn.call(el,e);
})
}
};
//一般而言,比较浏览器类型只需要一次就行了。所有有下面的代码。
//这样的话,if就只会判断一次。
var addEvent = function(){
if(window.addEventListener){
return function(el,type,fn,captrue){
el.addEventListener(type,function(e){
fn.call(el,e);
},captrue)
}
}else if(window.attachEvent){
return function(el,type,fn,captrue){
el.attachEvent("on"+type,function(e){
fn.call(el,e);
})
}
}
}
场景二:代码复用
let result = ['hi man','hi_man'].filter(item => {
return item.match(/|s+/g);
})
在函数式编程中,我们可以这样。
const findSpace = function(arr){
return arr.filter(item => {
return item.match(/\s+/g);
})
}
let result = findSpace(arr);
//以后每次查找带空格的数组的话,就执行findSpace。
虽然下面的代码看起来多,但是在多次使用的时候,威力就展现出来了。
参考链接:阮一峰函数式编程初探