# 函数

# 闭包

闭包 = 函数+与其相关的引用环境组成。

一般我们在函数内部定义新函数,这个新函数可以访问到外层的变量和参数,这些变量和参数不会随着函数的执行完毕而销毁,这 个新函数和外部的变量参数统称为闭包。

闭包属于高阶函数

function clo(x) {
  return function () {
    return x++;
  };
}
// x变量并不会销毁
const c = clo(1);
console.log(c()); // 1
console.log(c()); // 2
console.log(c()); // 3

优点:缓存变量,进行封装,实现状态共享和保存。同时私有化变量,避免污染作用域。

缺点:内存过大,内存泄漏。

例子:防抖,操作私有变量

# 高阶函数

  1. 函数作为参数
[1, 2, 3].filter((v) => {
  return v % 2 === 0;
});
  1. 函数作为返回值
function add(a) {
  return function (b) {
    return a + b;
  };
}

const sum = add(1);
console.log(sum(2)); // 3
console.log(sum(3)); // 4

# 柯里化函数

当一个函数有多个参数时,可以改造成先传递一部分参数调用,然后返回一个新的函数接受剩余的参数,最后返回结果

function sum(a, b, c, d) {
  return a + b + c + d;
}

function curry(fn) {
  return function c(...args) {
    // 判断参数是否一致
    // fn.length 形参
    // args.length 实参
    if (fn.length > args.length) {
      return function () {
        return c(...args.concat(Array.from(arguments)));
      };
    }
    // return fn.apply(null,args);
    return fn(...args);
  };
}

const getSum = curry(sum);
console.log(getSum(1, 2)(3)(4)); // 10