你不知道的秘密之采用纯函数思想规避BUG

纯函数思想规避BUG

  • 阅读本文的前提

    • 懂得JS预编译的原理

    • 懂得JS原始值和引用值在内存中的存储区别

  • JS开发中的痛点

    • JS中常常会创建全局变量 , 全局变量可以在程序的任何位置被访问 , 而程序中任何部分都可能修改全局变量 , 这种修改全局变量的行为可能会导致其他部分代码的行为出现异常 , 这是一种导致BUG的常见原因
  • 纯函数的定义和特点

    • 纯函数不依赖且不修改其作用域之外的变量 , 没有任何可观察的副作用

    • 纯函数非常容易进行单元测试 , 对于相同的输入 , 永远会得到相同的输出

    • 纯函数具有健壮性 , N个纯函数可以并行执行 , 且改变他们的执行次序不会对系统造成影响

  • 纯函数规避痛点

    • 由于纯函数不依赖且不修改其作用域之外的变量 , 我们只利用纯函数的返回值 , 所以采用纯函数写法是一种避免引入BUG的思想利器
  • 认识一下纯函数吧

    • 依赖或修改了作用域之外的变量的函数 <–> 不是纯函数 ( 充要条件 )

      // 非纯函数
      var x = 18;
      function compare(age) {
        return age > x;
      }
      console.log( compare(20) );
      
      // 纯函数
      var x = 18;
      function compare(age, num) {
        return age > num;
      }
      console.log( compare(20, x) );
      
    • 具有一定功能但没有返回值的函数 --> 不是纯函数 ( 必要条件 )

      // 非纯函数 : 因为修改了作用域之外的变量且函数没有返回值
      var arr = [];
      function add(_arr) {
        _arr.push( { name: 'liu' } );
      }
      add(arr);
      console.log(arr);
      
      // 纯函数 : 因为不影响作用域之外的变量且利用的是函数的返回值
      var arr = [];
      function add() {
        var newArr = [];
        newArr.push( { name: 'liu' } );
        return newArr;
      }
      console.log(arr, add());
      
  • 纯函数的实际应用

    • 纯函数可应用于过滤数组

      • 实现按过滤条件过滤数组的功能时 , 采用深克隆的方式拷贝数组的数据副本 , 并对数据副本进行操作 , 既能保证实现功能 , 也不会对原数组产生影响 , 和下文有异曲同工之妙
    • 组件化开发配合状态管理应用纯函数

      • 在VUE、REACT大型项目的组件化开发中 , 我们可以使用Vuex、Redux统筹管理组件状态( 下文称状态池 )

      • 但是项目中的任何一个组件直接修改状态池中的数据 , 都可能造成其他组件的运行异常

      • 而当Demo组件运行异常 , 我们很难定位到是哪一个组件对状态池的直接修改造成了Demo组件的运行异常

      • 所以在实现组件功能的时候我们就可以采用纯函数的思想 , 让组件采用深克隆的方式拷贝状态池中的数据副本 , 并对数据副本进行操作 , 这样就能避免组件对状态池中的数据产生直接影响

      • 纯函数在组件化开发中的应用不但可以保证各组件正常运行 , 也方便我们在调试代码时定位BUG的位置

      • 当然 , 纯函数的思想只能发挥一部分作用 , 实际开发中所有函数都是纯函数的愿望不可强求~

发布了49 篇原创文章 · 获赞 29 · 访问量 1903

猜你喜欢

转载自blog.csdn.net/Brannua/article/details/104513507