纯函数
怎么样才是纯函数
- 函数的返回结果 只依赖于他的参数,你交给他同样的值,他每次都会给他输出同样的结果
- 函数执行过程里面没有副作用
优点
- 结果可预测
- 代码可读性强
- 安全可靠
- 方便调试
当遇到问题时,如果函数是纯函数,那么可以确信,问题一定出在函数的输入参数
Javascript纯函数、非纯函数
Array.prototype.slice
- 纯函数
Array.prototyoe.splice
- 非纯函数
Array.prototype.map
- 纯函数
Array.prototype.toUpperCaser
- 纯函数
Math.random
- 非纯函数
Date.now
- 非纯函数
这些是纯函数么
怎么将函数脏副作用处理成纯函数式
依赖注入
function logWord (word) {
const dateString = new Date().toIsoString()
console.log(`${dateString}: ${word}`)
return word
}
function logWord (date, cnsl, word) {
const dateString = date.toIsoString()
cnsl.log(`${dateString}: ${word}`)
return word
}
logWord(new Date(), console, 'pure')
const date = {
toISOString: () => new Date().toISOString()
}
const cnsl = {
log: (str) => {
console.log(str)
}
}
logWord(date, cnsl, 'pure')
使用Effect函子
function fZero () {
console.log("不纯不纯不纯")
return 0
}
// 返回Effect的构造函数
function Effect (f) {
return {
map(g) {
return Effect(x => g(f(x)))
},
runEffects(x) {
return f(x)
},
}
}
const zero = Effect(fZero)
const increment = x => x + 1
const one = zero
.map(increment)
.map(increment)
one.runEffects() // --> 2
哪些用了纯函数
- Vue 的 computed
- Redux 的 Reducer
reducer
reducers都是纯函数
(previousState, action) => newState
衍生
函数式编程(functional ptogramming)
纯函数(pure functions)
柯里化(Currying)
面向对象编程(Object-oriented programming)
// 函数式编程写法
const getDouble = (a) => a * a
// 面向对象编程
function oop () {
window.open('https://www.google.com')
}