Skip to the content.

函数式特征

  1. Functions as first-class values, 函数作为一等公民.

可以把函数作为参数传递, 从而构造出 高阶函数 各种用法.

  const hi = function(name){
  return "Hi " + name;
  };

  const greeting = function(name) {
  return hi(name);
  };
  const greeting = hi

一个函数被不必要地包裹起来了,而且发生了改动,那么包裹它的那个函数也要做相应的变更.

  httpRequest('/post/method', function(json, err){
    return renderPost(json, err);
  });
  httpRequest('/post/method', renderPost);

目的: 规定代码粒度, 精简代码逻辑, 提高可维护, 可读性.

  1. Pure functions, 纯函数.

纯函数: 相同的输入永远得到相同的输出, 没有任何可观察到的副作用.

副作用: 与外部环境任何相关的.

目的: 保证写出的函数不会无故出现不可预知的错误,确保函数这个粒度的代码的准确性,稳定性.

slice, splice

  1. Everything is an expression, 一切皆是表达式.

JavaScript 代码体现为, 全为声明赋值语句. 避免涉及到跳转循环等语句. 需要辅助使用Maybe、尾递归等来优化流程.

函数

  1. 高阶函数

凡有参数或者返回值为函数, 被称为高阶函数.

  1. combinator组合子

compose函数: B combinator

  // compose函数的最简单实现
  const compose = (a, b) => c => a(b(c))

  // sample
  const cookAndEat = (food) => eat(cook(food));
  // 等同
  const cookAndEat = compose(eat, cook);

compose函数的复杂实现参考redux库/lodash库/ramda库的实现.

K combinator

  const K = x => y => x;

这是一个最基本的高阶函数

I combinator

  const I = x => x;
  1. 函数装饰器

not函数装饰器实现

  const not = fn => x => !fn(x)

  // sample
  const something = x => x != null
  const nothing = x => !something(x)
  // 正经的写法
  const nothing = not(something)

once函数装饰器


maybe函数装饰器

部分调用函数装饰器

  const callLeft = (fn, ...args) => (...remainArgs) => fn(...args, ...remainArgs)
  const callRight = (fn, ...args) => (...remainArgs) => fn(...remainArgs, ...args)

unary函数装饰器

  // 将参数装饰为只处理一个参数的函数
  const unary = fn => fn.length === 1

debounce函数和throttle函数