博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
(译) 函数式 JS #1:简介
阅读量:5925 次
发布时间:2019-06-19

本文共 2738 字,大约阅读时间需要 9 分钟。

“written equations on brown wooden board” by on

By:

简介

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

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

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

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

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

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


什么是函数式编程?

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

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

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

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

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

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

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

1. 它正在成为主流

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

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

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

2. 这很有挑战性

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

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

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

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

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

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

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

3. 这是一个新鲜的东西

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

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

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

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

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

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

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

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

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

,例如它的 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概念来说,这并不是一个强制要求。但是,它可以让你更轻松地完成示例并自己做一些尝试。

准备好了吗,下一章是:“”。

转载地址:http://khovx.baihongyu.com/

你可能感兴趣的文章
Caused by: java.lang.IllegalArgumentException: error at ::0 can't find referenced pointcut
查看>>
MySQL与MongoDB的操作对比
查看>>
由于没有远程桌面授权服务器可以提供许可证,远程会话被中断
查看>>
阿里的大数据好像挺牛的样子,好好研究下
查看>>
开源论坛系统/社群系统ThinkSNS+ PC端研发周报!
查看>>
Tomcat优化记录_数据源最大连接数_linux系统openfile最大限制
查看>>
什么是一致性Hash算法?
查看>>
jquery 返回顶部的两端代码
查看>>
我国.ORG域名注册量超11.9万个 升至全球第6位
查看>>
简单介绍下phpmyadmin 403错误的解决方法
查看>>
智联VS前程无忧:产品为王 流量为后
查看>>
我的友情链接
查看>>
netstat TCP.待整理。
查看>>
centos 6.2下,部署jdk1.6
查看>>
Linux管理工具
查看>>
root用户密码丢失
查看>>
webSocket&rest以及未来的web
查看>>
Kafka设计思想
查看>>
mysql explain 的type解释
查看>>
Qt5 中关于信号槽的改动
查看>>