随笔 - 175  文章 - 6  评论 - 0  阅读 - 36429

题目④ 说说对纯函数的理解

1. 什么是纯函数?

  • 概念:不依赖执行上下文,也不影响上下文的变量,输出只由输入决定
// 非纯函数,输入依赖外部变量
let b = 1
function unPure1(a) {
  return a + b
}

// 非纯函数,输出改变外部变量
let o = {}
function unPure2(object) {
  object.x = 1
  return object
}

// 纯函数,输入输出不影响外部变量
function pure(a) {
  let b = 1
  return a + b
}

2. 纯函数的两个特点

  • 相同的输入得到相同的输出

  • 没有副作用:不影响外部变量

3. 为什么要用纯函数?

3.1 纯函数的好处

  • 可缓存性

  • 可移植性/自文档性

  • 可测试性

3.1.1 可缓存性

纯函数可以根据输入来做缓存。实现缓存的是一种叫做memorize的技术

let squareNum = memorize((x) => { return x * x })
squareNum(4) // 16
squareNum(4) // 从缓存中读取输入值为4的结果 => 16
squareNum(5) // 25
squareNum(5) // 从缓存中读取输入值为5的结果 => 25
vue源码中的一段代码
/**
 * 只适用于缓存 接收一个字符串为参数的 fn
 */
export function cached(fn) {
  const cache = Object.create(null);
  return function cachedFn(str) {
    const hit = cache[str];
    return hit || (cache[str] = fn(str));
  };
}

/**
 * Capitalize a string.
 */
export const capitalize = cached((str) => {
  return str.charAt(0).toUpperCase() + str.slice(1);
});

capitalize即为缓存后的函数,如多次调用就会返回缓存后的值,从而节省计算资源,而这一切的前提都建立在 传入cached中的那个函数为纯函数的基础上

3.1.2 可移植性

在任何一个地方都可以随意使用,A项目中使用过的,B项目想要使用直接拿过就可以了

// 不纯的,如果B项目想要用到这个函数,需要将其依赖的其它服务搬过去
const singUp = function(attrs) {
  var user = saveUser(attrs)
  welcomeUser(user)
}
// 纯的,在B项目使用其功能只需将单个方法搬过去再给其注入需要的参数即可
const singUp = function(db, Email, attrs) {
  return function() {
    var user = saveUser(db, attrs)
    welcomeUser(Email, user)
  }
}
3.1.3 可测试性

如果传入相同的参数,它们将始终产生相同的结果。

  • 同时纯函数还使得维护和重构代码变得更加容易。正确地使用纯函数可以产生更加高质量的代码。并且也是一种更加干净的编码方式。
posted on   pleaseAnswer  阅读(60)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示