函数式编程(一)

引言

javascript是一门多范式编程语言,什么叫多范式?通俗一点来说,无论是烂大街的面向对象,仍是面向切面、函数式编程啥都能写。函数式编程不是用函数来编程,其主旨是将复杂的函数转化为简单的函数。这两年随着React的火热,函数式编程的概念也开始流行起来,RxJS、cycleJS、lodashJS、underscoreJS等多种开源库都使用了函数式的特性,可是相信绝大部分人看完有关函数式编程的书籍,仍是一脸懵逼。因此下面用我一年级的智商对函数式编程的理解,来介绍一些函数式编程的知识和概念。javascript

纯函数

纯函数的定义是,对于相同的输入,永远会获得相同的输出,并且没有任何可观察的反作用,也不依赖外部环境的状态。java

var xs = [1,2,3,4,5];

// 纯的
xs.slice(0,3);
//=> [1,2,3]

// 不纯的,改变了原数组的值
xs.splice(0,3);
//=> [1,2,3]

大多数有用的纯函数都应有至少一个参数。全部有用的纯函数都应该返回一些东西。数据库

let addNoReturn = (x, y) => {
    let z = x+ y
}
//无用的纯函数

如今你能够尝试打开浏览器的控制台,执行这样一个函数编程

let add = (x, y) =>  x + y 
add(1, 2) //3

执行一次,结果是3。
如今你能够再次执行一次数组

add(1, 2) //3

结果仍是3,再执行一次浏览器

add(1, 2) //3

结果仍是3,惊不惊喜,意不意外?
再看下面一个函数缓存

let wirteFile = (x) => {
      localStorage.setItem('font', '1')
      return x;
}

这个是纯函数吗,相同的结果也是相同的输出啊?
显然这个不是纯函数,纯函数不能修改任何外部变量,纯函数没有函数反作用
反作用可能包含,但不限于:app

  1. 更改文件系统编程语言

  2. 往数据库插入记录函数式编程

  3. 发送一个 http 请求

  4. 打印/log

  5. DOM 查询

看到这里你可能会把我拉黑,只有纯函数我还怎么写代码,怎么完成需求?
在函数式编程中,你不单单编写纯函数。
函数式语言不能消除函数反作用,它们只能限制函数反作用。由于程序必须和真实世界交互,每个程序总有一些部分必须是不纯的。目标是减小不纯代码的数量并将它们和咱们程序中的其余部分隔离。

纯函数不只下降了系统的复杂度,还有不少很棒的特性,好比可缓存性

const memorize = f => {
  const cache = {};

  return function() {
    const arg_str = JSON.stringify(arguments);
    cache[arg_str] = cache[arg_str] || f.apply(f, arguments);
    return cache[arg_str];
  };
};

const addNumber = memorize( x => x + 1)

//第一次计算慢
addNumber(1)
//第二次有了缓存,速度快了很多
addNumber(1)

咱们不用每次都本身实现memorize函数,lodash、ramda都提供了很好的封装。

相关文章
相关标签/搜索