Skip to content

纯函数

相同的输入永远会得到相同的输出。

y=f(x)

高阶函数

高阶函数(Higher-order-function)的定义是:可以把函数作为参数传递给另一个函数;可以把函数作为另一个函数的返回结果。

使用高阶函数的意义/好处

使函数抽象化,可以帮我们屏蔽实现细节,每次在调用函数时,我们只需要关注想要的目标。

对通用问题进行抽象,方便重复调用

使代码更加简洁

闭包

闭包(Closure)的定义是:函数和周围的状态(词法环境)的引用捆绑在一起形成闭包。 换句话说就是,闭包的形成是因为函数引用了当前作用域以外的其他作用域中的变量。

函数执行会形成一个执行栈,当执行栈中的内容被执行完成之后,会被游览器垃圾回收机制移除。但如果堆上的作用域成员被外部引用,是不会被移除的,因此内部函数依然可以访问外部函数中的成员。

使用闭包的好处

延长了外部函数中的变量的作用范围。

柯里化(Curry)

当一个函数有多个参数的时候,先传一部分参数并调用它,这部分参数以后永远不变。然后返回一个新的函数接收剩余的参数,最后返回结果。 柯里化可以让我们给一个函数传递较少的参数得到一个已经记住了某些固定参数的新函数。因此,柯里化是一种对函数参数的缓存

柯里化的好处

让函数变得灵活,让函数的粒度变得更小

可以把多元函数转换成一元函数,可以组合使用函数产生强大的功能。

通用柯里化函数

function curry(fn) {
  return function iner(...args) {
    if (fn.length !== args.length) {
      return iner(args.concat(Array.from(arguments)));
    } else {
      fn.apply(fn, args);
    }
  };
}

函数组合(compose)

纯函数和柯里化函数很容易写出洋葱代码,这是我们不希望看到的。而函数组合可以让我们把细粒度的函数重新组合生成一个新的函数。

实现原理

function compose(...args) {
  return function (value) {
    return args.reduceRight(function (ret, fn) {
      return fn(ret);
    }, value);
  };
}

函数组合需要满足结合律,假如有三个函数 a、b、c,我们可以先把 a、b 函数组合,然后再组合 c;也可以先把 b、c 组合,然后再组合 a,结果是一样的。