(译) 函数式 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:!”。


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

查看所有标签

猜你喜欢:

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

数据结构

数据结构

殷人昆 / 清华大学 / 2007-6 / 39.00元

《数据结构》(第2版)“数据结构”是计算机专业的核心课程,是从事计算机软件开发和应用人员必备的专业基础。随着计算机的日益普及,“数据结构”课程也在不断地发展。《数据结构》(第2版)按照清华大学计算机系本科“数据结构”大纲的要求,从面向对象的概念、对象类设计的风格和数据结构的层次开始,从线性结构到非线性结构,从简单到复杂,深入地讨论了各种数据结构内在的逻辑关系及其在计算机中的实现方式和使用。此外,对......一起来看看 《数据结构》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具