函数式编程概念
- 函数式编程是一种编程范式。函数式编程的思维方式就是把现实世界的事物和事物之间的联系抽象到程序世界(对运算过程进行抽象)。
- 函数式编程中的函数并不是指的程序中的函数(方法),而是数学中的函数,即映射关系。比如y = sin(x)中x和y的关系,当x的值确定时y的值也确定了。
- 函数式编程中必须有输入和输出。并且相同的输入要得到相同的输出。
函数式编程的常见特性
1. 无副作用
这里指调用函数时不会修改外部状态,一个函数调用n次后依然返回相同的结果。
2. 引用透明
一个函数只会用到传递给它的变量以及自己内部创建的变量,不会使用到其他变量。
3. 函数是一等公民
指的是函数与其他数据类型一样,处于平等地位,可以赋值给其他变量,也可以作为参数,传入给另一个函数,或者作为另一个函数的返回值。
高阶函数
什么是高阶函数
- 将一个或多个函数作为参数
- 可以把函数作为另一个函数的返回结果
我们常用的filter,map,reduce,forEach,every,some等都是高阶函数。
下面模拟一下filter,来体现函数作为参数的情况
function filter(array,fn){
let result = []
for(let i = 0;i<array.length;i++){
if(!!fn(array[i])){
result.push(array[i])
}
}
return result
}
而函数作为另一个函数的返回结果,可以看下面的例子
//对一个函数只执行一次
function once(fn){
let done = false;
return function () {
if(!done){
done = true;
return fn.apply(this,arguments)
}
}
}
这个函数就是返回一个函数,你可以接收这个函数,并定义自己想实现的方法。
const click = once(function(i){
console.log(`第${i}次点击`)
})
高阶函数的意义
- 抽象可以帮我们屏蔽细节,只需要关注与我们的目标
- 高阶函数是用来抽象通用的问题
- 使用函数式编程可以使代码更简洁
闭包
闭包概念
- 函数和其周围的状态(词法环境)的引用捆绑在一起形成闭包。
- 可以在另一个作用域中调用一个函数的内部函数并访问到该函数的作用域中的成员。
闭包本质
函数在执行的时候会放到一个执行栈上当函数执行完毕后会从执行栈上移除,但是堆上的作用域成员因为被外部引用不能释放,因此内部函数依然可以访问外部函数的成员。
闭包作用
闭包延长了外部函数内部变量的作用范围。
//demo 求多少次方的函数
function makePow(power){
return function(number){
return Math.pow(number,power)
}
}
纯函数
纯函数的概念:
- 相同的输入永远会得到相同的输出,而且没有副作用
- 纯函数类似于数学中的函数,即用来描述输入和输出的关系
纯函数的好处
- 可缓存 :因为相同输入有相同的输出。所以我们可以把相同输入得到的结果缓存起来
- 便于测试
- 并行处理
- 在多线程环境下并行操作共享的内存数据很可能会出现意外情况
- 纯函数不需要访问共享的内存数据,所以在并行环境下可以任意运行纯函数
函数的副作用
函数的副作用就是让一个函数不纯,即相同的输入可能会得到不同的输出。如果函数依赖于外部的状态就无法保证输出相同,就会带来副作用。
- 副作用的来源
- 配置文件
- 全局变量
- 数据库
- 用户的输入
所有的外部交互都有可能带来副作用,副作用也使方法通用性下降不适合扩展和可重用性,同时副作用会给程序中带来安全隐患给程序带来不确定性,但是副作用不可能完全禁止,尽可能控制它们在可控范围内发生。
总结
这篇文章主要总结了js函数式编程的一些概念,下一篇会总结函数柯里化,函数组合。
函数式编程02
网友评论