Skip to main content

纯函数

怎么样才是纯函数

  1. 函数的返回结果 只依赖于他的参数,你交给他同样的值,他每次都会给他输出同样的结果
  2. 函数执行过程里面没有副作用

优点

  1. 结果可预测
  2. 代码可读性强
  3. 安全可靠
  4. 方便调试

当遇到问题时,如果函数是纯函数,那么可以确信,问题一定出在函数的输入参数

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

哪些用了纯函数

  1. Vue 的 computed
  2. 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')
}