day7_函数式编程

79 阅读2分钟

1.函数式编程

函数式编程是一种规范,指的是脱离业务场景,选择最合适代码的执行方式,保留函数的纯粹性

2.函数是一等公民

函数是一等公民,指的是函数可以像其他数据类型那样,既可以赋值给变量,作为函数的参数,也可以作为函数的返回值

2.1 作为变量

const fn = function(){}

2.2 作为参数

const fn = function(x){
    console.log(x);
}

function test(callback){
    const foo = 2;
    callback(foo);
}

test(fn);

2.3 作为返回值

const fn = function(x){
    return function(y){
        return x+y;
    }
}

const f1 = fn(2);
console.log(f1(3));

3.纯函数

3.1 定义

纯函数指相同的输入,总会得到相同的输出,且不产生副作用,即对外部没有影响(比如引用了外部的变量、对外部数据进行了修改等)

  • 如数组的slice和splice
    • slice不会修改原数组,即不会产生副作用,相同的输入,总会得到相同的输出
    • 而splice每次调用都会修改原数组,即产生了副作用,且每次调用,返回的结果都不同
    • 故slice是纯函数,而splice不是
  • 又比如引用了外部变量
    • 因为外部变量是可以修改的,故存在相同的输入,不一定得到相同的输出
let v = 20;
function fn(x) {
    return x > v;
}

setInterval(()=>{
    v = Math.random();
    fn(0.5);
},1000)

3.2 副作用

  • 副作用包括但不限于
    • I/O操作
    • 更改文件系统
    • 往数据库插入记录
    • 发送一个http请求
    • 可变数据
    • 打印/log
    • DOM查询
    • 访问系统状态
    • new Date();
    • console.log();
    • Math.random();

4. 柯里化

  • 柯里化指的是将一个含有多参数的函数转为具有较少参数的函数的过程
  • 柯里化是一种函数式编程的技术
  • 只传递给函数一部分参数来调用它,并返回一个函数去处理剩下的参数。
  • 它不仅被用于 JavaScript,还被用于其他编程语言。
  • 如 fn(a,b,c) -> fn(a)(b)(c)
  function test(a, b, c, d) {
    return a + b + c + d;
  }

  const curry = function (f) {
    return function curryFn() {
      const args = Array.prototype.slice.call(arguments);
      if (f.length > args.length) {
        return function () {
          const newArgs = Array.prototype.slice.call(arguments);
          return curryFn.apply(null, args.concat(newArgs));
        };
      }
      return f.apply(null, args);
    };
  };

  const g = curry(test);
  const gg = g(1)(2)(3)(4);
  console.log("gg", gg);