纯函数

146 阅读1分钟

纯函数

概念

相同的输入必然得到相同的输出。举个例子:

array.slice(0,2); //纯函数
array.splice(0,2);//非纯函数,因为splice会改变原数组

纯函数相关工具库:lodash

优点

  • 可缓存

    function getArea(r) {
      console.log(r);
      return Math.PI * r * r;
    }
    function memoize(fn) {
      let cache = {};
      return function () {
        let key = JSON.stringify(arguments);
        cache[key] = cache[key] || fn.apply(fn, arguments);
        return cache[key];
      }
    }
    let getAreaWithMemoize = memoize(getArea);
    console.log(getAreaWithMemoize(2)); // 只在第一次运行的时候打印了 r 
    console.log(getAreaWithMemoize(2));
    console.log(getAreaWithMemoize(2));
    
  • 可测试

  • 可并行处理

    • 多线程环境下并行操作共享内存中的数据(线程不安全),可能会得到意外的结果,即副作用
    • 纯函数是无状态函数,不依赖外部数据,因此在并行下可以任意执行纯函数

副作用

纯函数是无状态函数,相同的输入始终得到相同的输出;如果函数依赖外部数据,则无法保证有相同的输出,就产生了副作用。

  • 外部数据包括:
    • 数据库
    • 用户输入
    • 配置文件