纯函数数据库
Lodash——纯函数的表明npm
纯函数的好处编程
以前讲了函数的前置知识,若是仍是不太明白的同窗能够参考文章 函数式编程(一)—— 前置知识 ,下面咱们能够进行函数式编程的基础内容。
相同的输入永远会获得相同的输出,并且没有任何可观察的反作用。segmentfault
纯函数就相似数学中的函数(用来描述输入和输出之间的关系),y = f(x)数组
let numbers = [1, 2, 3, 4, 5] // 纯函数 // 对于相同的函数,输出是同样的 // slice方法,截取的时候返回截取的函数,不影响原数组 numbers.slice(0, 3) // => [1, 2, 3] numbers.slice(0, 3) // => [1, 2, 3] numbers.slice(0, 3) // => [1, 2, 3] // 不纯的函数 // 对于相同的输入,输出是不同的 // splice方法,返回原数组,改变原数组 numbers.splice(0, 3) // => [1, 2, 3] numbers.splice(0, 3) // => [4, 5] numbers.splice(0, 3) // => [] // 下面函数也是纯函数 function getSum (n1, n2) { return n1 + n2 } console.log(getSum(1, 2)) // 3 console.log(getSum(1, 2)) // 3 console.log(getSum(1, 2)) // 3
新建文件夹 -> npm init -y -> npm i lodash缓存
const _ = require('lodash') const array = ['jack', 'tom', 'lucy', 'kate'] // head的别名是first _.head(array)也能够 console.log(_.first(array)) //jack console.log(_.last(array)) //kate console.log(_.toUpper(_.first(array))) //JACK console.log(_.reverse(array)) //[ 'kate', 'lucy', 'tom', 'jack' ] // 数组的翻转不是纯函数,由于会改变原数组。这里的reserve是使用了数组的reverse,因此也不是纯函数 const r = _.each(array, (item, index) => { console.log(item, index) // kate 0 // lucy 1 // tom 2 // jack 3 }) console.log(r) // [ 'kate', 'lucy', 'tom', 'jack' ]
由于对于相同的输入始终有相同的结果,那么能够把纯函数的结果缓存起来,能够提升性能。安全
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)) // 4 // 50.26548245743669 // 50.26548245743669 // 50.26548245743669 // 看到输出的4只执行了一次,由于其结果被缓存下来了
那咱们能够模拟一个记忆函数多线程
function memoize (f) { let cache = {} return function () { // arguments是一个伪数组,因此要进行字符串的转化 let key = JSON.stringify(arguments) // 若是缓存中有值就把值赋值,没有值就调用f函数而且把参数传递给它 cache[key] = cache[key] || f.apply(f,arguments) return cache[key] } } let getAreaWithMemory1 = memoize(getArea) console.log(getAreaWithMemory1(4)) console.log(getAreaWithMemory1(4)) console.log(getAreaWithMemory1(4)) // 4 // 50.26548245743669 // 50.26548245743669 // 50.26548245743669
纯函数让测试更加的方便app
反作用就是让一个函数变得不纯,纯函数的根据市相同的输入返回相同的输出,若是函数依赖于外部的状态就没法保证输出相同,就会带来反作用,以下面的例子:模块化
// 不纯的函数,由于它依赖于外部的变量 let mini = 18 function checkAge (age) { return age >= mini }
反作用来源:
全部的外部交互都有可能带来反作用,反作用也使得方法通用性降低不适合扩展和可重用性,同时反作用会给程序中带来安全隐患给程序带来不肯定性,可是反作用不可能彻底禁止,咱们不能禁止用户输入用户名和密码,只能尽量控制它们在可控范围内发生。