前端学习之函数式编程—纯函数

Posted 萌萌的DDD

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了前端学习之函数式编程—纯函数相关的知识,希望对你有一定的参考价值。

Part 01 纯函数概念

纯函数:相同的输入永远会得到相同的输出,而且没有任何可观察的副作用

  • 纯函数就类似数学中的函数,用来描述输入与输出之间的关系,例如:y=f(x)

Part 02 案例:slice和splice函数 

数组的slice 和 splice 分别是 纯函数 和 不纯的函数

  • splice 返回数组中的指定部分,不会改变原数组
  • splice 对数组进行操作,返回该数组,会改变原数组

 

// 纯函数 和 不纯函数
// slice 和 splice 


let arr = [1, 2, 3, 4]

// 纯函数 多次调用返回相同内容
console.log(arr.slice(0, 2)); //[ 1, 2 ]
console.log(arr.slice(0, 2)); //[ 1, 2 ]
console.log(arr.slice(0, 2)); //[ 1, 2 ]

// 不纯函数 splice 会修改原数组  因此多次调用返回的结果不相同

console.log(arr.splice(0, 2)); //[ 1, 2 ]
console.log(arr.splice(0, 2)); //[ 3, 4 ]
console.log(arr.splice(0, 2)); //[]
// 纯函数案例

function getSum(num1, num2) {
    return num1 + num2
}

console.log(getSum(1, 2)); // 3
console.log(getSum(1, 2)); // 3
console.log(getSum(1, 2)); // 3

根据相同的输入,始终获得了相同的输出,因此称为纯函数

  • 函数式编程不会保留计算中间的结果,所以变量是不可变的
  • 我们可以把一个函数的执行结果交给另一个函数去处理

Part 03  Lodash 一致性、模块化、高性能的 javascript 工具库

安装lodash

//安装 lodash (node 方法)
const _ = require('lodash');
const _ = require('lodash/core');
const fp = require('lodash/fp');
const array = require('lodash/array');
const object = require('lodash/fp/object');
const at = require('lodash/at');
const curryN = require('lodash/fp/curryN');

// 安装lodash (npm)

// npm init -y
// npm i lodash
const arr = ['jack', 'tony', 'ethen', 'soap']

console.log(_.first(arr)); // jack
console.log(_.last(arr)); // soap
console.log(_.toUpper(_.first(arr))); // JACK
console.log(_.reverse(arr)); //[ 'soap', 'ethen', 'tony', 'jack' ]
const r = _.each(arr, (item, index, arr) => {
    console.log(item);
})
console.log(r); //['jack', 'tony', 'ethen', 'soap'] 数组本身

Part 04 纯函数的优势

  1. 可缓存 

        因为纯函数对相同的输入始终有相同的结果,所以可以把函数的结果缓存起来

        如果结果值相同,多次调用只会执行一次,但仍然会获取值

// 记忆函数
const _ = require('lodash');

function getAxios(params) {
    console.log(params);
    return params * 10 * 10 * 10 * 10
}

const getAreaWithMemory = _.memoize(getAxios)
console.log(getAreaWithMemory(4)); 
console.log(getAreaWithMemory(4));
console.log(getAreaWithMemory(5));
console.log(getAreaWithMemory(5));

// 模拟 memoize 方法的实现

function memoize(fn) {
    let cache = {}
    return function() {
        let key = JSON.stringify(arguments)
        cache[key] = cache[key] || f.apply(f, arguments)
        return cache[key]
    }
}

 2.可测试

        纯函数让测试更方便(单元测试)

3.并行处理

  •   在多线程环境下并行操作共享的内存数据很可能会出现意外的情况\\
  •   纯函数不需要访问共享的内存数据,所以在并行环境下可以任意运行纯函数(webWorker)

Part 05 副作用

// 不纯函数

let mini = 18 

function checkAge(age){
    return age >= mini
}

当函数如果依赖外部的变量或状态,就无法保障输出相同的结果,如果外部变量被修改,则会带来副作用

副作用来源:"

  • 配置文件
  • 数据库
  • 用户的输入
  • 等等

以上是关于前端学习之函数式编程—纯函数的主要内容,如果未能解决你的问题,请参考以下文章

前端学习之函数式编程—柯里化

前端学习之函数式编程—函数式编程概念+头等函数

前端学习之函数式编程—高阶函数

前端学习之函数式编程—闭包

Scala学习之函数式风格编程

Python学习之函数式编程