(译) 函数式 JS #1:简介

栏目: 编程语言 · 发布时间: 5年前

内容简介:on如果你是一名 JavaScript 开发人员,那么你很可能会 已经看到过"函数式编程","函子","闭包"或"不变性"等概念了。你可能想知道这些东西到底是什么意思。也许你已经读过一些相关资料。或者你可能正在尝试将一些 FP (Functional Programming) 实践应用到你的代码中。如果是这样,那么我想我们在同一条船上!
“written equations on brown wooden board” by

on

如果你是一名 JavaScript 开发人员,那么你很可能会 已经看到过"函数式编程","函子","闭包"或"不变性"等概念了。你可能想知道这些东西到底是什么意思。也许你已经读过一些相关资料。或者你可能正在尝试将一些 FP (Functional Programming) 实践应用到你的代码中。

如果是这样,那么我想我们在同一条船上!

大约两年前,我开始在工作中使用JavaScript。从那时起,我一直在努力加深我对函数式编程的理解。

一开始,每当听到"柯里化(currying)"之类的东西,或者我的同事告诉我"请使用 map 而不是 forEach 并避免这些副作用"的时候,我感到很迷惑。

从那时开始到现在,我已经学到了很多。试图理解 FP 实践是一种非常激动人心的体验-- 到今天依然如此!

现在,我想把 我到目前为止所学到的提炼成一系列文章 --一些假如我现在从头开始学习 FP 的话自己希望能够读到的系列文章。我希望这能帮助到那些有跟我几年前类似程度和背景的人。

什么是函数式编程?

函数式编程是一种编程范式--- 一种思考和构造代码的方式。它是过程式编程或面向对象编程的替代方案。

FP 爱好者会说他们的目标是优化代码的可重用性,可读性和可测试性。他们工具箱中的常用 工具 是: 函数(functions) ,把函数 组合(compose) 起来构建更复杂的功能,以及 避免共享状态(avoiding shared state)副作用(side effects)

如果这些话听起来不知所云 -- 别担心,我们很快就会搞清楚的!

为什么要学习函数式编程?

互联网上有大量的文章讨论为什么函数式编程比面向对象编程更好。如何用它生成更易读,更易于扩展,更易于测试和维护的代码; 什么是声明式(declarative)编程,等等。

我同意其中大部分内容。我不想再重复相同的论点,所以我希望你看一下上面的一些链接。

不过,我接下来要讲的是另外一些东西。我会告诉你为什么要考虑学习函数式编程。我会分享一下我的收获,那也可能将是你的收获。

1. 它正在成为主流

如果你看一下不断变化的 JS 生态,很明显可以看出来函数式编程实践已经日益普及。大量非常酷的新框架和库都受到了 FP 的重大影响, 例如:

  • React -- 可重用的组件和纯函数
  • Redux -- 强迫你不要使用可变状态
  • Reason -- 函数式方法和不变性
  • Elm -- 可以编译成 JavaScript 的函数式语言
  • Underscore.js ,lodash 和Ramda -- 这几个库都内置了 FP

你可能已经或者将要使用这些工具之一。如果你很好地理解了函数式编程的概念,那么你可以更快地掌握这些框架和库。否则你可能要多花一些时间。

2. 这很有挑战性

离开大学之后,你的大脑是不是再也没有像在学校时那样全速运转过了?

我肯定有过。我的意思是,我的工作充满了挑战。我花了很多时间思考:业务问题,系统架构,团队状态以及许多其他东西。

这并不是说跟上微积分课一样。学那个的时候我需要绞尽脑汁来理解所有的概念,以及它们之间如何相互关联。

嗯,学习函数式编程的感觉其实有点儿类似。这也不奇怪,毕竟函数式编程就是来源于数学。

学习过程中会有很多新的术语,理解这些知识可能会让你头晕眼花。但是在醍醐灌顶的时刻,你会体会到极大的满足。

我相信如果你在大学里喜欢数学,那你肯定也会喜欢学习这些东西的。

哦……这个说法可能不会让你爱上函数式编程的,对吧?

3. 这是一个新鲜的东西

我相信,即使你不打算在日常工作中切换到函数式编程,学习新的编程范式也是大有好处的。不仅仅是因为这是一个挑战 -- 更是因为它感觉 很不一样

尝试新的编码风格可以让你接触到另一种截然不同的做事方法。也会迫使你从不同的角度思考问题。

你可能会认为多花一些时间在已经熟练掌握的工具上面更划算。我知道那样收效更快,更务实,可以让你的在那些你熟悉的技术上钻得更

但我相信,作为软件开发者,我们也需要拓 我们的视野。它有助于我们更好地与其他开发人员沟通,特别是当他们跟我们背景不同的时候。从不同的角度来看问题,可以帮助我们做出更好的决策。

学习新的编程语言是拓宽专业知识的好方法。但是学习新的 编程范式 更好。

好的,但……为什么是 JavaScript?

如果你已经决定要学习FP,那么下一个问题就是: 使用 JavaScript 是一个很好的方式吗?

首先我得说 JavaScript 可能不是学习函数式编程概念的最佳途径。原因大概有以下这些。

其他更加函数式的语言,内置了不可变数据结构. 而 JavaScript 没有,因此你需要额外使用一个库。这样以来,你的代码会比较冗长。

JavaScript 试图模仿 Java ,例如它的 classnew ,以及其他一些类似的东西。

JavaScript标准库很糟糕。它当然不是考虑到为 FP 概念而设计的。

关于 JS 是不是函数式编程的最佳选择,还有很多争论。

但是另一方面,JavaScript 也有很多特性有助于实现函数式编程:

  • 函数在 JS 里是一等公民 (First-class functions)
  • 闭包 (Closures)
  • 对象和数组字面量 (Object and Array Literals) (译注:参考)
  • 大量的 FP 库

此外,我认为最重要的一点是:JavaScript 非常流行,并且会越来越流行。

如果你打算使用 JavaScript,为什么不尝试学习一种非常有用的新范式呢?

让我们开始吧!

在本系列的下一部分中,我将介绍一些 FP 概念 - 从最基本的概念开始。我打算涵盖以下几个方面:

  • 纯函数(pure function),一等公民的函数 (first-class functions),高阶函数 (Higher-order functions)
  • 共享状态(shared state),不变性(Immutability),副作用(Side effects),引用透明(Referential transparency)
  • 闭包(Closures)
  • 局部调用(Partial application),柯里化(Currying)
  • 递归(Recursion)
  • 组合(Composition),Point-free 风格
  • FP 库
  • 涵子(Functors),Applicative Functors,Monads

我会假定你已经了解了 JavaScript 的基础知识,ES6 等等。对于理解FP概念来说,这并不是一个强制要求。但是,它可以让你更轻松地完成示例并自己做一些尝试。

准备好了吗,下一章是:“函数式 JS#2:函数 :v:!”。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

商战

商战

杰克•特劳特、阿尔•里斯 / 李正栓、李腾 / 机械工业出版社 / 2011-3 / 42.00元

本书重点阐述了商战中的四种常用战略形式,如防御战、进攻战、侧翼战和游击战,针对每一种形式又提出了三条应遵循的原则,以及如何在具体的商战中应用这些原则。本书分析了商战中的实际案例:可口可乐与百事可乐的战役,汉堡王与温迪斯对麦当劳的挑战以及DEC对阵IBM等。这些人们熟知品牌的案例在作者精心的组织下,使读者不仅加深了对本书中心思想的理解,而且学习了如何在实战中具体应用各种营销战略和策略的技巧。 ......一起来看看 《商战》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

在线进制转换器
在线进制转换器

各进制数互转换器

SHA 加密
SHA 加密

SHA 加密工具