具体描述
在后端,函数式语言层出不穷。在前端,函数式最后的边界也已经被渐渐打破。Scala的Scala.js、Clojure的ClojureScript都试图同构移向前端。然而,原生JavaScript其实也可以通过丰富的库让前端的函数式编程一样的舒适和优雅。
《前端函数式攻城指南》涵盖了大部分函数式编程思想,包括JavaScript的函数式支持,Clojure风格的集合、递归、函数组合、宏、模式匹配、实用的Monads,以及前端的并发编程。
《前端函数式攻城指南》适合想要了解函数式编程的JavaScript程序员或者想学习JavaScript的函数式程序员阅读。
作者简介
目录信息
1.1 JavaScript也是函数式语言吗 1
1.1.1 编程范式 1
1.1.2 JavaScript的函数式支持 3
1.2 作为函数式语言,JavaScript还差些什么 10
1.2.1 不可变数据结构 11
1.2.2 惰性求值 11
1.2.3 函数组合 12
1.2.4 尾递归优化 13
1.3 Underscore你错了 14
1.3.1 跟大家都不一样的 map 函数 14
1.3.2 ClojureScript 16
1.3.3 Mori 17
1.4 小结 18
第2章 集合 19
2.1 集合的使用 20
2.1.1 向量(vector) 20
2.1.2 Map 23
2.1.3 函数组合子 24
2.2 持久性数据结构 27
2.2.1 向量的持久性数据结构 28
2.2.2 最后一片叶子不完整 31
2.2.3 所有叶子完整且叶子个数不大于完全树的叶子个数 32
2.2.4 所有叶子完整且叶子个数大于完全树的叶子个数 34
2.3 不可变性 35
2.3.1 致命魔术 36
2.3.2 引用透明性 38
2.3.3 函数式React 40
2.3.4 线程不安全 42
2.4 惰性序列 44
2.4.1 改良奥利奥吃法 44
2.4.2 惰性求值与及早求值 46
2.4.3 惰性求值的实现 48
2.5 小结 50
第3章 递归 51
3.1 不可变性与递归 51
3.1.1 真的需要循环吗 52
3.1.2 递归还是循环 54
3.2 柯里悖论 55
3.2.1 Y组合子 57
3.2.2 栈是多么容易爆 60
3.3 尾递归优化 62
3.4 蹦跳乐园(Trampoline) 64
3.4.1 有穷状态机(DFA) 65
3.4.2 Trampoline 67
3.5 小结 69
第4章 函数组合 70
4.1 Underscore到底做错了什么 70
4.1.1 自由(Free)变量与约束(Bound)变量 72
4.1.2 闭包 74
4.2 柯里化有什么用 75
4.3 Transducer 78
4.3.1 Reducer 79
4.3.2 来看看更好更快的解法 79
4.3.3 Reducer 80
4.3.4 Reducible 81
4.3.5 Transducer详解 82
4.3.6 跟柯里化有什么区别 83
4.4 组合与管道 84
4.4.1 管道(Pipeline) 84
4.4.2 组合与管道 86
4.4.3 管道函数 87
4.5 小结 87
第5章 Macro宏 89
5.1 什么是REPL 89
5.1.1 宏扩展器(Macro Expander) 90
5.1.2 那么前端怎么办 92
5.2 为什么要语法糖 93
5.2.1 只是为了语法漂亮吗 94
5.3 Sweet.js 94
5.3.1 Rule Macro 95
5.3.2 Case Macro 97
5.4 Infix Macro 和 Operator 104
5.4.1 Infix Macro 104
5.4.2 自定义操作符 105
5.5 小结 106
第6章 模式匹配 107
6.1 Destructure 107
6.1.1 对象 109
6.1.2 数组 109
6.1.3 函数 109
6.2 Arity 函数 110
6.3 Fizz Buzz 111
6.3.1 字面匹配(Literal Matching) 111
6.3.2 绑定 113
6.3.3 Vector与Map匹配 113
6.3.4 Guard 114
6.3.5 Sparkler 114
6.4 代数数据类型(ADT) 116
6.5 小结 118
第7章 Monadic编程 119
7.1 链式调用 119
7.1.1 Promise 120
7.1.2 高阶Promise 122
7.2 Monad 123
7.2.1 函子(Functor) 123
7.2.2 Applicative Functor 126
7.2.3 含幺半群(Monoid) 130
7.2.4 Monad就是容器界的管道 132
7.2.5 Monad就是自函子范畴上的一个幺半群 136
7.3 走钢丝 139
7.3.1 用Monad表示薛定谔猫 139
7.3.2 皮尔斯走钢丝 140
7.4 Monad在JavaScript中的应用 143
7.4.1 Promise版本的走钢丝 144
7.4.2 When 144
7.5 Reactive编程 146
7.5.1 流(Stream) 146
7.5.2 Functor 147
7.5.3 Applicative 147
7.5.4 Monad 148
7.5.5 一个“简单”的Reactive实例 149
7.6 小结 153
第8章 并发编程 154
8.1 什么是并发 154
8.1.1 异步与多线程 155
8.1.2 JavaScript的并发模型 157
8.2 通信顺序进程(CSP) 160
8.3 使用Generator实现CSP 162
8.3.1 Generator 163
8.3.2 Go Block 163
8.3.3 timeout 164
8.3.4 take <! 165
8.3.5 put >! 165
8.3.6 JavaScript CSP版本的例子 166
8.4 实战 CSP 168
8.4.1 使用移植的core.async 168
8.4.2 使用ES7中的异步函数 169
8.4.3 try catch 170
8.5 小结 173
参考资料 174
· · · · · · (收起)
读后感
前言要求 ======>1)最好能看懂JavaScript 2)想学JavaScript 请问我通过什么学JavaScript? 再说了,书名《前端函数式攻城指南》,我相信看的人应该都会JavaScript吧? 原谅我只是错略的读了下,咬着牙读到了100多页,实在是读不下去了(因为,看着痛苦!扔了可惜!)。 46P...
其实很想打5分的,但是考虑到可能会误导很多前端的同学,还是4分吧。 书是很好的书,前提是对Haskell Lisp Clojure等函数式语言都要稍微有点了解,然后对常见的库Ramda Lodash等等也要有些了解,如果有一些预备知识的话看这本书会轻松一些。看到有人吐槽讲的乱,这种可能是对函...
其实很想打5分的,但是考虑到可能会误导很多前端的同学,还是4分吧。 书是很好的书,前提是对Haskell Lisp Clojure等函数式语言都要稍微有点了解,然后对常见的库Ramda Lodash等等也要有些了解,如果有一些预备知识的话看这本书会轻松一些。看到有人吐槽讲的乱,这种可能是对函...
书比较薄,花了点时间看完了。 我能感受到作者用了很多不同的方式去证明理论知识,书中涉及的知识面也是挺广的,比如作者用了很多非js的代码去证明所讲的理论,不止一种语言,而且再用js证明的时候,还不停的把es5和es6相互穿插着,思绪看的比较乱,因为看代码的时候经常要在不...
其实很想打5分的,但是考虑到可能会误导很多前端的同学,还是4分吧。 书是很好的书,前提是对Haskell Lisp Clojure等函数式语言都要稍微有点了解,然后对常见的库Ramda Lodash等等也要有些了解,如果有一些预备知识的话看这本书会轻松一些。看到有人吐槽讲的乱,这种可能是对函...
用户评价
这本书的内容,对我来说,完全打开了一个新的视角。我一直觉得,前端开发就是面向对象,组件化,然后各种框架的使用。但这本书让我意识到,函数式编程才是更底层、更普适的一种编程范式,而且在前端领域有着巨大的潜力。它让我开始重新审视自己过去写的代码,发现了很多可以改进的地方。比如,书中关于“状态管理”的那部分,让我对Redux、Vuex这些状态管理库的理解更深刻了,也让我明白了为什么它们要采用那种函数式的设计。虽然有些章节,我需要花更多的时间去消化,但每一次的阅读,都能让我产生新的思考。它不是那种提供“银弹”的书,而是一种思维的启迪,让你学会如何用更优雅、更健壮的方式去解决问题。我觉得,这本书不仅仅是关于函数式编程,更是关于如何成为一个更优秀的前端工程师。
这本书,我真的拖了很久才开始读。起初是被书名吸引,《前端函数式攻城指南》,感觉好有气势,像是要征服一片神秘的领域。拿到书的时候,翻了几页,觉得里面的概念有点抽象,跟平时写JavaScript的思路不太一样,当时有点打退堂鼓,觉得是不是太高深了,自己掌握不了。但你知道的,对于一个前端开发者来说,函数式编程就像一道绕不开的坎,总感觉不搞懂它,就好像少了一块重要的拼图。所以,虽然一开始有点畏惧,但内心深处的好奇和对技术精进的渴望还是驱使我继续。我印象最深的是,它并没有上来就讲一堆晦涩的理论,而是通过一些实际的、前端开发中经常遇到的场景来引入函数式思想,比如数据处理、状态管理等等。这种方式让我感觉,哦,原来函数式编程并不是空中楼阁,而是可以切实解决我们日常工作中遇到的问题。虽然我还没完全消化里面的所有内容,但已经能感受到它带来的思维冲击,对代码的理解似乎变得更透彻了。
我必须得说,这本书的名字有点“唬人”,《前端函数式攻城指南》,听起来像是要打一场艰苦卓绝的战斗。但读起来,却发现它更像是一位经验丰富的老兵,在细致地拆解每一个攻城器械的原理,告诉你如何巧妙地运用它们,而非让你去硬碰硬。它并没有强迫你去记住那些复杂的函数式编程术语,而是通过生动的例子,让你潜移默化地理解函数式思维的核心。比如,它会通过一个关于“过滤用户列表”的场景,来讲解如何使用组合函数来达到目的,而不是像我之前那样,写一堆if-else或者链式调用。这种教学方式,让我在理解概念的同时,还能立刻看到它在实际开发中的应用。虽然我的前端经验不算特别丰富,但这本书的深入浅出,让我感觉自己真的在“攻克”函数式编程这座大山,而且过程中充满了惊喜和成就感。
对于这本书,我的体验简直是“痛并快乐着”。一开始,我抱着一种“学习新潮技术”的心态去翻阅,结果发现,这哪里是“新潮”,这简直是“根基”!它让我意识到,之前我写的大部分代码,虽然能跑,但其实存在不少隐患,尤其是在团队协作和项目迭代过程中,那些隐藏的bug会像雪球一样越滚越大。这本书里关于不变性、纯函数、函数组合的讲解,对我来说简直是醍醐灌顶。它让我学会了如何更优雅地处理数据流,如何避免那些让人抓狂的副作用。虽然有些章节,我需要反复阅读好几遍,甚至在脑海里模拟代码的执行过程,才能真正理解。但每一次的“顿悟”,都让我觉得之前付出的时间和精力是值得的。这本书真的不是那种“速成”的学习资料,它需要你沉下心来,去思考,去实践。但一旦你真正掌握了其中的精髓,你会发现,你写出来的代码,会变得更加清晰、稳定,而且更容易被别人理解。
说实话,这本书完全颠覆了我对前端开发的很多固有认知。我一直以为,前端就是把UI写得好看,交互做得流畅,然后数据增删改查。但这本书让我看到了一个更深层次的视角。它所倡导的函数式编程,不仅仅是学习一些新的语法或者API,更重要的是一种思维方式的转变。它鼓励我们去思考“做什么”,而不是“怎么做”,去拥抱不变性,去减少副作用。这在前端开发中尤其重要,因为我们经常要处理复杂的状态和异步操作,而函数式编程的这些理念,恰恰能帮助我们写出更健壮、更易于维护和测试的代码。当然,刚开始接触的时候,确实需要一些时间去适应,尤其是像“纯函数”、“柯里化”、“高阶函数”这些概念,一开始听起来有点陌生,需要反复咀嚼才能理解其中的精髓。但一旦你掌握了,你会发现,之前那些让你头疼的Bug,好像突然有了清晰的解决思路。这本书的讲解方式,我觉得很巧妙,不会让你感到枯燥乏味,而是循序渐进地引导你进入这个神奇的世界。
今年读过的最差的技术书籍,作者完全不具备写作素养,写出来的东西只是给自己看的
作者写的意犹未尽,他的技术确实牛b,也尝试写的很亲民,但是没点卵用。多看看阮一峰的写作风格
我觉得这本书在解释 Monad 上面还是说得挺好的
同事写的书,国庆放假期间读了一遍,收获颇多,虽然很多理论知识如Y不动点,Monad还没有办法完全理解,但是可以发现,函数式编程将逐渐成为未来发展的方向,不管是后端或者前端。
很棒的一本书,但看之前最好有一些基础知识作为铺垫,以及要有足够的兴趣,否则看起来可能会比较吃力。