为什么学习函数式编程?
- 核心理解是,为了方便复用,类库的编写
- FP(函数式编程)是编程范式(风格)
重点是:一一映射的关系,相同的输入有相同的输出(纯函数)
高阶函数
- 把函数作为参数传递、作为结果返回
- 抽象帮我们屏蔽细节,只关注我们自身的目标
书写高级函数 every、some、forEach
// every
const every = (array, fn) => {
let result = true
for (let value of array) {
result = fn(value)
if (!result) {
break
}
}
return result
}
// some
const some = (array, fn) => {
let result = false
for (let value of array) {
result = fn(value)
if (result) {
break
}
}
return result
}
闭包 (Closure)
- 就是函数对,上级作用域中变量的捕获
- 闭包存在的时间:闭包里的值是不会消失的,会一直存在内存中,除非我们手动删除。如果滥用闭包,会造成内存泄漏的问题。函数在执行的时候会放到一个执行栈上当函数执行完毕之后会从执行栈上移除,但是堆上的作用域成员因为被外部引用不能释放,因此内部函数依然可以访问外部函数的成员
function salary(base) {
return function (number) {
return base + number
}
}
let salaryLever1 = salary(12000)
let salaryLever2 = salary(15000)
console.log(salaryLever1(2000))
console.log(salaryLever2(5000))
纯函数
- 相同的输入永远会得到相同的输出、类似于数学中的一一映射
- 自己模拟一个 memoize 函数:
// 记忆函数
const _ = require('lodash')
function getArea (r) {
console.log(r)
return Math.PI * r * r
}
// let getAreaWithMemory = _.memoize(getArea)
// console.log(getAreaWithMemory(4))
// console.log(getAreaWithMemory(4))
// console.log(getAreaWithMemory(4))
// 模拟 memoize 方法的实现
function memoize (f) {
let cache = {}
return function () {
let key = JSON.stringify(arguments)
cache[key] = cache[key] || f.apply(f, arguments)
return cache[key]
}
}
let getAreaWithMemory = memoize(getArea)
console.log(getAreaWithMemory(4))
console.log(getAreaWithMemory(4))
console.log(getAreaWithMemory(4))