js 纯函数思想

作者: PorcoPP | 来源:发表于2017-04-08 18:12 被阅读832次

纯函数

若一个函数对相同的输入,永远会得到相同的输出,并且不会影响该函数作用域以外的环境变量,则此函数称为纯函数。

纯函数和非纯函数:

// 纯函数
function add(a) {
  var b = 0;
  return a + b;
}

// 非纯函数,依赖外部变量
var b = 0;
function add(a) {
  return a + b;
}

// 非纯函数,依赖系统时间
function now() {
  return new Date();
}

// 非纯函数,依赖随机数
function random(){
  return Math.random();
}

//非纯函数,设置外部 cookie
function setCookie(){
  document.cookie = "name=Porco";
}

纯函数可以做到自给自足,对测试友好、没有外部依赖,既不受外部环境影响,也不会影响外部环境。

纯函数的好处显而易见,但是 js 很难能全部做到纯函数,因为它存在变量,你不可能在函数之间传递着变量,还能做到纯函数。更好的做法是将纯函数操作抽象出来,然后提供统一的非纯操作入口。

比如 reactVirtual DOM 就是这样的思想,举例来说,原先我们的每次人为操作都会触发绑定事件或者监听,然后直接操作 dom 元素。对于冒泡事件来说,一次操作会触发多次 dom 渲染。react 将节点跟操作都抽象了出去,我们的操作首先修改内存中的虚拟dom,其他操作会继续操作这个dom,而当我们对dom的操作全部完成之后,一次将全部变更的 dom 节点重新渲染。

我们可以通过将函数一层层提纯,提高代码复用率、降低测试难度

// 原函数
function double(a, b) {
  var sum = a + b;
  var doubleSum = sum * 2;
}

// 提取出两个纯函数 add、multiplicative,可以通过对单个函数的测试通过,确保 double 的正确性
// 事实上,只要 add、multiplicative 这两个纯函数通过测试,double 甚至可以不用测
// 因为 纯函数 和 纯函数的组合,得到的依旧是一个纯函数
function add(a, b) {
  return a + b;
}
function multiplicative(a, b) {
  return a * b;
}
function double(a, b) {
  return multiplicative(add(a, b),  2);
}

相关文章

  • js 纯函数思想

    纯函数 若一个函数对相同的输入,永远会得到相同的输出,并且不会影响该函数作用域以外的环境变量,则此函数称为纯函数。...

  • js 纯函数

    什么是纯函数 纯函数是函数式编程中非常重要的一个概念,简单来说,就是一个函数的返回结果只依赖于它的参数,并且在执行...

  • js纯函数

    定义 简单来说,一个函数的返回结果只依赖于它的参数,并且在执行过程里面没有副作用,我们就把这个函数叫做纯函数。这么...

  • JS纯函数

    纯函数简单定义 1.函数返回的结果只依赖它的参数2.函数的执行不会对该函数之外的其他对象等造成影响(副作用) 举例...

  • JS 纯函数

    纯函数:就是一个函数的返回结果只依赖于它的参数,不依赖于且不改变它作用域之外的变量状态的函数,并且在执行过程中没有...

  • 深入浅出Rxjs笔记 一

    一.函数式编程 函数式编程要求: 声明式 纯函数 数据不可变js 不算纯粹意义上的函数式编程语言,但是,在js中函...

  • 深入redux源码 (1)

    redux 的安装 redux 有五个js构成,纯函数实现 因为 redux 是纯函数,所以很方便进行测试.在we...

  • JS纯函数概念

    判断是否为纯函数的两个指标 纯函数和非纯函数的简单例子 1、纯函数 2、非纯函数 Redux中对使用纯函数redu...

  • 函数式编程阅读笔记

    《js函数式编程指南》 函数式编程中 不涉及this改变的问题(因为用不到this)。 纯函数是这样一种函数,即相...

  • vue 与 react 的区别

    设计思想不同 react 的设计思想是:函数式的思想,把组件设计成纯函数,状态和逻辑通过参数传入,通过单向数据流保...

网友评论

    本文标题:js 纯函数思想

    本文链接:https://www.haomeiwen.com/subject/gmglattx.html