函数式编程(一)

弁言

javascript是一门多范式编程言语,什么叫多范式?浅显一点来说,不管是烂大街的面向对象,照样面向切面、函数式编程啥都能写。函数式编程不是用函数来编程,其宗旨是将庞杂的函数转化为简朴的函数。这两年跟着React的炽热,函数式编程的观点也最先流行起来,RxJS、cycleJS、lodashJS、underscoreJS等多种开源库都使用了函数式的特征,然则置信绝大部份人看完有关函数式编程的书本,照样一脸懵逼。所以下面用我一年级的智商对函数式编程的明白,来引见一些函数式编程的学问和观点。

纯函数

纯函数的定义是,关于雷同的输入,永久会获得雷同的输出,而且没有任何可视察的副作用,也不依赖外部环境的状况。

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;
}

这个是纯函数吗,雷同的效果也是雷同的输出啊?
明显这个不是纯函数,纯函数不能修正任何外部变量,纯函数没有函数副作用
副作用能够包括,但不限于:

  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都供应了很好的封装。

    原文作者:林小新
    原文地址: https://segmentfault.com/a/1190000009323696
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞