函数式编程总结
函数式编程入门已经看完了,来总结一下吧。学了大概半个多月了,觉得学到了很多东西,想应用到实际中去,于是面试的时候问了一下面试官函数式编程在实际开发中的应用场景。面试官说函数式编程是个好东西,但是实际应用的场景不多。而且用函数式编程写出来的东西没接触过的人可能看不懂,需要通读代码。不过多了解总是好的。还是有点失望的。但是总是有机会用到的,就算只是比别人多了解一点也是好的。以下代码复杂一点的我会写 ES6 和 ES5 两个版本,看的清楚一些。简单的就只写 ES6。话不多说,总结一下这段时间的学习。
第一章 函数式编程简介
第一章简要的介绍了一下函数式编程,以及函数式编程可以带来的一些好处。比较重要的有下面几个方面
- 函数式编程仅依赖输入输出就可以完成自身的逻辑,不会改变任何外部变量的值。
- 函数的引用透明性:对于所有相同的输入都返回相同的输出。
- 函数式编程是告诉代码该怎么做,声明式编程只关心做什么
具体的可以参考 函数式编程简介
第二章 JavaScript 函数基础
这一章主要讲了一些 js 里面的基本概念,如何用 babel 将 ES6 的代码转换成 ES5 的。然后构建了我们将要运行的代码的环境
具体的可以参考 函数式编程之 Javascript 基础及环境配置
第三章 高阶函数
这一章主要讲了一下高阶函数的概念,即接受另一个函数作为参数的函数称为高阶函数。然后简单介绍了 js 中的函数。并介绍了高阶函数与抽象的关系。抽象让我们能够专注于预定的目标而无需关心底层的实现。我们还创建了几个简单的函数来帮助理解抽象的概念。
具体的可以参考 函数式编程之高阶函数
第四章 闭包与高阶函数
第四章简单介绍了闭包的概念,然后介绍了闭包在高阶函数中的应用并创建了几个简单的函数
-
tap 函数
tap 函数接收一个参数,返回一个包含该参数的闭包函数。主要用于调试。
// ES6 const tap = (value) => { (fn) => { typeof(fn) === 'function' && fn(value) console.log(value) } } // ES5 var tap = function(value){ return function(fn){ typeof(fn) === 'function' && fn(value) console.log(value) } }
-
unary 函数
接收一个函数,将它的参数长度变为 1。比如 parseInt 接收两个参数,因此使用 map 方法会发生错误。这时候就是它的用武之地了
const unary = (fn) => { return fn.length === 1 ? fn : arg => fn(arg) }
-
once 函数
接收一个函数。顾名思义,就是该函数只能运行一次,比如支付等场景下
// ES6 const once = (fn) => { let done = false; return function(){ return done ? undefined :((done = true),fn.apply(this,arguments)); } }
-
memoized 函数
接收一个函数,返回一个函数,每次调用的结果先在 cache 中找,如果找不到再调用原函数。
// ES6 const memoized = (fn) => { const cache = { } return (arg) => cache[arg] || (cache[arg] = fn(arg)) } // ES5 var memoized = function(fn){