函数式编程

什么是函数式编程?

英文的叫法是: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。

虽然下面的代码看起来多,但是在多次使用的时候,威力就展现出来了。

参考链接:阮一峰函数式编程初探

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值