译者团队(排名不分前后):阿希、blueken、brucecham、cfanlife、dail、kyoko-df、l3ve、lilins、LittlePineapple、MatildaJin、冬青、pobusama、Cherry、萝卜、vavd317、vivaxy、萌萌、zhouyaojavascript
关于译者:这是一个流淌着沪江血液的纯粹工程:认真,是 HTML 最坚实的梁柱;分享,是 CSS 里最闪耀的一瞥;总结,是 JavaScript 中最严谨的逻辑。通过捶打磨练,成就了本书的中文版。本书包含了函数式编程之精髓,但愿能够帮助你们在学习函数式编程的道路上走的更顺畅。比心。前端
本书主要探索函数式编程[1](FP)的核心思想。在此过程当中,做者不会执着于使用大量复杂的概念来进行诠释,这也是本书的特别之处。咱们在 JavaScript 中应用的仅仅是一套基本的函数式编程概念的子集。我称之为“轻量级函数式编程(FLP)”。java
注释: 题目中使用了“轻量”二字,然而这并非一本“轻松的”“入门级”书籍。本书是严谨的,充斥着各类复杂的细节,适合拥有扎实 JS 知识基础的阅读者进行研读。“轻量”意味着范围缩小。一般来讲,关于函数式编程的 JavaScript 书籍都热衷于拓展阅读者的知识面,并企图覆盖更多的知识点。而本书则对于每个话题都进行了深刻的探究,尽管这种探究是小范围进行的。git
让咱们面对这个事实:除非你已是函数式编程高手中的一员(至少我不是!),不然相似“一个单子仅仅是自函子中的幺半群”这类说法对咱们来讲毫无心义。程序员
这并非说,各类复杂繁琐的概念是无心义的,更不是说,函数式编程者滥用了它们。一旦你彻底掌握了轻量的函数式编程内容,你将会/希望会想要对函数式编程的各类概念进行更正式更系统的学习,而且你必定会对它们的意义和缘由有更深刻的理解。github
可是我更想要让你可以如今就把一些函数式编程的基础运用到 JavaScript 编程过程当中去,由于我相信这会帮助你写出更优秀的,更符合逻辑的代码。编程
更多关于本书背后的动机和各类观点讨论,请参看[前言]。闭包
本书主要在 on Leanpub 平台上以电子版本的形式进行出版。我也尝试出售本书的纸质版本,但没有肯定的方案。app
除了购买本书之外,若是你想要对本书做一些物质上的捐赠,请在 patreon 上进行操做。本书做者感谢你的慷慨解囊。frontend
本书内容大多源自于我教授的一个同名课程(以公司举办的公开或内部研讨会这样的形式进行)。
若是你喜欢本书的内容,并但愿组织此类课程,或者组织关于其余 JS/HTML5/Node.js 课程,请经过如下方式联系我:
getify.me
我还提供一些能够在线点播的 JS 培训课程。我在 Frontend Masters 上开办课程,例如个人 Functional-Lite JS 研讨会。还有一些课程发布在 PluralSight 上。
很是欢迎对于本书的任何内容贡献。可是在提交 PR 以前请务必认真阅读 Contributions Guidelines。
本书全部的材料和内容都归属 (c) 2016-2017 Kyle Simpson 全部。
本书根据Creative Commons Attribution-NonCommercial-NoDerivs 4.0 Unported License 进行受权许可.
众所周知,我是一个函数式编程迷。我尝试阅读最新的学术论文,业余时间乃至工做间隙研究抽象代数(译者注:抽象代数又称近世代数,是研究各类抽象公理化代数系统的数学学科,也是现代计算机理论基础之一),并四处传播函数式编程的理念和语言。我所书写的 JavaScript 代码,每一条语句都是纯的。没错,我就是一个彻头彻尾的函数式编程教条式的狂热者。关于为何要写纯的语句,请看我写的这本书。
其实我之前并非这样子... 我曾痴迷于面向对象,并热衷于使用面向对象的方法来构建“真实世界”。我是人造机器人的发明者,夜以继日地修正机器人以达到更高精度的控制力。我也是有意识木偶的创造者,手指在键盘上的轻舞飞扬赋予了它们生命。作为黑客界的盖比特(译者注:盖比特是玩具之父),在连续不间断的写了 5 年面向对象的代码后,我对于这些成果仍是不甚满意。整个过程也并不顺利,我一直感受本身是一个糟糕的程序员,甚至失去了信心,认为写出既简单,又灵活同时又很好扩展的代码是不可能的。
我想是时候去尝试一些新的方法了,我开始涉足函数式编程的理念,并把它用在个人代码中。个人同事对此很是惊诧,他们根本不知道我在干什么。那段时间里我写的代码很是糟糕、另人生厌、简直是垃圾。形成这样结果的缘由是我缺乏一个目标或者说愿景。固然如今那个会编码的蟋蟀杰明尼(译者注:原文使用 Jiminy-Coding-Cricket 迪士尼动画人物蟋蟀杰明尼来暗指以前蹩脚的本身)已经不在了。在花费了好长时间,写了好多垃圾程序后我才弄明白怎样正确进行函数式编程。
如今,经历了那些乱七八糟的探索后,我感受到纯函数编程实现了它所承诺的代码可读性和可复用。我再也不发明而是发现个人模型,我像一个正在揭开巨大阴谋的侦探,在软木板上钉满了数学证据。一个数字时代的库斯托(译者注:库斯托是个传奇式的人物,探险家、电影制片人,一个享有戴高乐将军同样世界性声誉的法国人,做者比喻本身学习函数式编程就像库斯托探索海洋通常)以科学的名义记录下了这片奇特土地的特征!虽然并不完美,仍有不少东西要学习,但我对个人工做和产出从未有过如今这般满意!
假如一开始就有这本书,我探索纯函数式编程世界的道路就会更平坦一点,而不是荆棘满地。本书有两层:第一层教会你如何在天天的编码工做中,有效地使用各类各样的函数式构造方法。另外一层则更重要,本书会提供一个准星,确保你不会偏离函数式编程的原则。
函数式编程是一种编程范式,Kyle 倡导使用它来实现声明式编程和函数式编程,同时该范式还能够与 JavaScript 世界造成平衡和互动。经过学习本书,你无需完全理解范式的一切,就能了解纯函数式编程的基础;你无需从新创造轮子,就能得到练习和探索函数式编程的技能,并让代码运行良好;你无需像我以前同样漫无目的地徘徊、甚至走回头路就能让你的职业生涯更上一层楼。你的合做者和同事们必定会欣喜若狂!
Kyle (译者注:Kyle 是火爆全球的《你不知道的 JavaScript》一书原做者)是一位伟大的老师,他对函数式编程的宏伟蓝图不懈追求,不放过任何一个角落和缝隙,同时他也苦学习者之苦。他的风格与行业产生共鸣,将你们的水平总体提升了一个档次。他的工做成果不只出如今不少人的收藏夹中,也在 JavaScript 发展历史上占据坚实地位。Kyle 老师是绝世高手,你值得拥有。
函数式编程有不少种定义。Lisp 程序员和 Haskell 程序员对于函数式编程的定义大相径庭。OCaml 和 Erlang 语言对于函数式编程范式的见解也截然不同。即便在同一种语言 JavaScript 中,你也能看到函数式编程不一样的定义。但总有一种纽带把这些不一样的函数式编程链接在一块儿,这个纽带是一个有些模糊的“我一看就知道”的定义,这听起来有点下流(有人确实以为函数式编程下流)。本书旨在抓住这个纽带,并不让你学习某些圈子的固定习语,而是让你获取相关知识,这些知识不论在哪一个语言的函数式编程中都适用。
本书是你开启函数式编程旅途的绝佳起点。开始吧,Kyle 老师...
-Brian Lonsdorf (@drboolean)
单子是自函子范畴上的一个幺半群
有晕头转向吗?不要担忧,我本身也被绕晕了!对于那些已经了解函数式编程的人来讲,这些专业术语才有意义,然而对于大部分人而言,它们没有任何意义。
这本书并不打算教你以上那些专业术语的具体含义。若是那正是你想查找的,请继续查阅。事实上,已经有不少从头至尾(正确的方式)介绍函数式编程的书了。若是你在深刻学习函数式编程,这些专业术语有很重要的意义,你确定会对这些专业术语愈来愈熟悉。
可是本书打算以另外一种方式讲解函数式编程。我将从函数式编程的一些基础概念讲起,并尽量少用晦涩难懂的专业术语。咱们将尝试以更实用的方法来探讨函数式编程,而非纯粹的学术角度。毫无疑问,确定会有专业术语。可是我将会当心谨慎的引入这些术语并解释为什么它们如此重要。
可悲的是我并不是酷酷的函数式编程俱乐部的一员。我从没有正式学过函数式编程。尽管我有计算机方面的教育背景并对数学有必定了解,但数学符号跟我理解的编程彻底是两回事。我历来没写过一行 Scheme、Clojure 或 Haskell 代码,也不是老派的 Lisp 程序员。
我曾参加过不可胜数的讨论函数式编程的会议,每次都但愿能完全搞明白函数式编程中那些神秘的概念究竟是什么意思。然而每次我都失望而归,那些概念在我脑海里乱成一团,我甚至不清楚本身学了些什么。也许我学到了些东西吧,可是很长时间以来我都不能肯定本身学到了什么。
经过不断的编程实践,而非站在学术的角度,我慢慢的理解了那些对函数式编程者[1]
来讲很简单直白的重要概念。你是否也有相似的经历 —— 你早就知道一件事,但直到好久以后你忽然发现它居然还有一个你历来不知道的名字!?
也许你像我同样;好几年前就据说过像“map-reduce”,“big data”等这些术语,但并不懂它们的实际意义。最终我明白了map(..)函数到底作了哪些事情 —— 在我知道列表操做是通向函数式编程者之路的基石,而且为什么它们如此重要以后。我知道映射好久了,甚至在我知道它叫map(..)
以前。
最终我开始整理这些想法并将它们称之为「轻量级函数式编程」(FLP)。
可是,为何学习函数式编程如此重要,即使只是学习轻量级函数式编程?
最近几年我愈来愈深入的理解到编程的核心是人,而不是代码,我甚至将其视为一种信仰。我坚信代码只是人类交流的手段,只是它产生的反作用(仿佛听到了自我引用的笑声)才对电脑发出具体指令。
在我看来,函数式编程的核心在于让你在编程时使用一些广为人知、易于理解的模式。通过验证,这些模式能够有效隔离让代码难以理解的错误。因此,函数式编程 —— 咳,轻量级函数式编程 —— 是每一个开发者均可以掌握的重要工具之一。
monad的含义是,一旦你搞懂了,你就没法跟别人解释什么是monad了。
Douglas Crockford 2012 "Monads and Gonads"
我但愿这本书有可能打破上面的诅咒,尽管咱们要到最后的附录部分才开始讨论「monad」。
科班出身的函数式编程者常常宣称只有 100% 使用函数式编程才算是真正地使用函数式编程:这是一种要么全有要么全无的主张。它会让人以为若是编程时只有一部分使用了函数式编程而另外一部分没用到,整个程序会被那些没有使用函数式编程的部分污染,从而认为使用函数式编程并不值得。
我想明确地说:我认为绝对主义并不存在。这没有意义,就像愚蠢地建议我只有使用完美的语法,这本书才算完美,若是犯了一点点错误,就会让整本书质量变低同样。
我写地越清楚,先后越一致,你阅读此书的体验将越好。但我不是一个天衣无缝的做者。有些章节可能比另一些写的好。可是那些有待提升的章节不会使书中写的好的部分黯然失色。
一样的道理也适用于代码。随着你愈来愈多的使用函数式编程的模式,你的代码质量会愈来愈高。25% 的时间使用它们,你会获得一些好处。80% 的时间使用它们,你将收益更多。
除了几处仅存的特例,你不会在本书里看到不少绝对的论断。咱们讨论的是要追求的目标和现实中方方面面的权衡。
欢迎来到最实用的函数式编程的学习之旅。咱们将共同探讨学习!
【下一章】翻译连载 |《JavaScript 轻量级函数式编程》- 第 1 章:为何使用函数式编程?
iKcamp原创新书《移动Web前端高效开发实战》已在亚马逊、京东、当当开售。